Java 5新增的enum关键词,可以定义枚举类。该类是一个特殊的类,可以定义自己的field、方法、可以实现接口,也可以定义自己的构造器。
但枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。枚举类的内部定义的枚举值就是该类的实例(且必须在第一行定义,当类初始化时,这些枚举值会被实例化)。
由于这些枚举值的实例化是在类初始化阶段,所以应该将枚举类的构造器(如果存在),采用private声明(这种情况下默认也是private)。
另外补充一点,由于JVM类初始化是线程安全的,所以可以采用枚举类实现一个线程安全的单例模式。
链接:https://www.zhihu.com/question/19908744/answer/30946346
参考代码:
public static final class AutoOffsetReset extends Enum {
public static AutoOffsetReset[] values() {
return (AutoOffsetReset[]) $VALUES.clone();
}
public static AutoOffsetReset valueOf(String name) {
return (AutoOffsetReset) Enum.valueOf(com / sf / kafka / api / consume / ConsumeOptionalConfig$AutoOffsetReset, name);
}
public String getValue() {
return value;
}
public static final AutoOffsetReset BEGIN;
public static final AutoOffsetReset NOW;
public static final AutoOffsetReset CUSTOM;
private String value;
private static final AutoOffsetReset $VALUES[];
static {
BEGIN = new AutoOffsetReset("BEGIN", 0, "smallest");
NOW = new AutoOffsetReset("NOW", 1, "largest");
CUSTOM = new AutoOffsetReset("CUSTOM", 2, "custom");
$VALUES = (new AutoOffsetReset[] {
BEGIN, NOW, CUSTOM
});
}
private AutoOffsetReset(String s, int i, String value) {
super(s, i);
this.value = value;
}
}