欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA基础知识之枚举类

程序员文章站 2022-07-15 10:40:29
...

一、枚举类的含义

    java的SE文档并未对枚举类做详细的定义解释,通过对博客的搜索,下面这篇文章对于枚举类的解释特别到位,建议看这个链接进行学习 https://blog.csdn.net/qq_31655965/article/details/55049192#chatqa

   为什么要理解枚举类?因为自己做项目时会遇见一种特别的情况,如一个业务的进度有10个阶段,自己常用的套路就是数据库设计为int型来代表进度,然后由数字0-9来代表不同阶段,这样就会造成一个问题,数据库备注里面需要备注一遍,然后程序里面还需要专门去设计10个静态常量来代表这10个阶段,但是需要更加的扩展进行某些操作时非常的麻烦

  但是看别人的源码,发现并没有去设计10个静态常量来操作,而是通过枚举类来进行操作,可以达到上面的目的还可以拓展出很多属性和方法来因此感觉要了解下枚举类

二、枚举类的定义

public enum Size
{
   
    S,M,L,X,XLL;

    Size(){}
    
}

    1) 枚举类定义的关键词是enum而不是class

     2) 枚举类的第一行代码必定是枚举实例序列,代表着该枚举类拥有的实例

    3)  构造方法的修饰词是private,代表着该类无法在其它类中通过new来创建,保证了实例序列的可控制

    4) 若要在实例序列后声明构造函数等,必须在实例序列后加分号,否则会报错

通过编译代码和反编译代码,可以看到实例序列的本质如下:该实例是staitc的,因此可以通过类.实例名获取,该实例是final因此无法修改

   public staitc final Size S=new Size();
    
   public staitc final Size M=new Size();

  通过编译代码和反编译代码,可以看到枚举类的本质如下:该类继承java.lang.Enum类,意味着该类无法继承其它类,该类是final类意味着无法被其他类继承

 public final class Size extends java.lang.Enum<>

三、枚举类的自定义变量

    假如我想定义5个枚举实例分别代表5个不同的int型值以表示不同的阶段,那么则需要在枚举类中定义自定义变量

    若想要一个枚举实例代表好几个意思呢?则可以继续增加自定义变量,而后通过构造函数进行赋值设置即可

public enum Size
{
    unsubmitted(0),submitted(1),Approval(2),ok(3),turn_down(4);
    
    
    //自定义变量
    private int count;
    
    Size(int count)
    {
        this.count=count;
        
    }
    
    //获取自定义变量
    public int getCount()
    {
        return this.count;
    }
  
    
}

四、枚举类的方法

1)valueOf(“name”):根据指定的字符串转成枚举实例,若字符串名称与枚举类中的实例名称不符合,则抛出异常

 Size submitted=  Size.valueOf("submitted")

2)values():获取该枚举类的所有枚举实例

Size[] values = Size.values();

五、枚举实例的方法

1)toString() :获取枚举实例的字符串名称

 System.out.println(Size.ok.toString()); //得到ok

2)ordinal() :获取该实例在枚举序列的下标位置(程序自动给枚举序列中的实例从左至右安排下标,从0开始)

System.out.println(Size.ok.ordinal()); //得到3

3)compareTo():比较两个枚举实例在序列中的位置,实际是比较两个枚举实例在序列中的下标的大小

System.out.println(Size.ok.compareTo(Size.submitted))

    public final int compareTo(E o) {
        Enum other = (Enum)o;
        Enum self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

六、枚举类的实际扩展

     暂未理解,一般枚举就是到自定义变量这块即可,故暂时不了解过深

相关标签: 枚举类