Enum 类的声明:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable
枚举也是类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:
enum Type {
A, B, C, D;
}
创建 enum 时,编译器会自动为我们生成一个继承自 java.lang.Enum 的类,上面的 enum 可以简单看作:
class Type extends Enum {
public static final Type A;
public static final Type B;
...
}
对于上面的例子,可以把 Type 看作一个类,而把 A,B,C,D 看作类的 Type 的实例
“类”方法和“实例”方法
在 enum 中,我们可以定义类和实例的变量以及方法:
enum Type {
A, B, C, D;
static int value;
public static int getValue() {
return value;
}
String type;
public String getType() {
return type;
}
}
在原有的基础上,添加了类方法和实例方法。把 Type 看做一个类,那么 enum 中静态的域和方法,都可以视作类方法。和调用普通的静态方法一样,这里调用类方法也是通过 Type.getValue() 即可调用,访问类属性也是通过 Type.value 访问
下面的是实例方法,也就是每个实例才能调用的方法。那么实例是什么呢?没错,就是 A,B,C,D。所以调用实例方法,也就是通过 Type.A.getType() 来调用
最后,对于某个实例而言,还可以实现自己的实例方法:
enum Type {
A {
public String getType() {
return "I will not tell you";
}
}, B, C, D;
static int value;
public static int getValue() {
return value;
}
String type;
public String getType() {
return type;
}
}
这里,A 实例后面的 {…} 就是属于 A 的实例方法,可以通过覆盖原本的方法,实现属于自己的定制
除此之外,还可以添加抽象方法在 enum 中,强制 ABCD 都实现各自的处理逻辑:
enum Type {
A {
@Override
public String getType() {
return "A";
}
}, B {
@Override
public String getType() {
return "B";
}
}, C {
@Override
public String getType() {
return "C";
}
}, D {
@Override
public String getType() {
return "D";
}
};
public abstract String getType();
}