在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外。然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看。
 1、可以在enum中添加变量和方法
先来看一段代码示例:
java代码 
01
public enum State {
02
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
03
        // 成员变量
04
        private String name;
05
        private int index;
06
07
        // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化
08
        private State(String name, int index) {
09
            this.name = name;
10
            this.index = index;
11
        }
12
13
        // 普通方法
14
        public static String getName(int index) {
15
            for (State c : State .values()) {
16
                if (c.getIndex() == index) {
17
                    return c.name;
18
                }
19
            }
20
            return null;
21
        }
22
23
        // get set 方法
24
        public String getName() {
25
            return name;
26
        }
27
28
        public void setName(String name) {
29
            this.name = name;
30
        }
31
32
        public int getIndex() {
33
            return index;
34
        }
35
36
        public void setIndex(int index) {
37
            this.index = index;
38
        }
39
    }
从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。
2、可以用来定义常量
先来回顾一下Java中如何定义常量吧,看下面一段代码:
java代码 
1
public static final int normalState = 1;
2
private static final int updateState = 2;
下面我们还可以用enum枚举来代替上面的常量定义,代码如下:
java代码 
1
public enum State { 
2
  Normal, Update, Deleted, Fired
3
}
在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。
3、在enum中实现接口
先来看下面一段代码:
java代码 
01
public interface ICanReadState {
02
        void read();
03
04
        String getState();
05
}
06
07
    public enum State implements ICanReadState {
08
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
09
10
        private String name;
11
        private int index;
12
13
        private State(String name, int index) {
14
            this.name = name;
15
            this.index = index;
16
        }
17
18
        // 接口方法1
19
20
        @Override
21
        public String getState() {
22
            return this.name;
23
        }
24
25
        // 接口方法2
26
        @Override
27
        public void read() {
28
            System.out.println(this.index + ":" + this.name);
29
        }
30
    }
和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。
总结
说白了,enum枚举类型是一个不可以被继承的final类,就以上面的State枚举为例,如果你查看enum类型的字节码,其实是State类型的类静态常量。