Java中繼承java.lang.Enum
阿新 • • 發佈:2019-02-17
Java 5新增的enum關鍵詞,可以定義列舉類。該類是一個特殊的類,可以定義自己的field、方法、可以實現介面,也可以定義自己的構造器。
但列舉類使用enum定義後在編譯後預設繼承了java.lang.Enum類,而不是普通的繼承Object類。enum宣告類繼承了Serializable和Comparable兩個介面。且採用enum聲明後,該類會被編譯器加上final宣告(同String),故該類是無法繼承的。列舉類的內部定義的列舉值就是該類的例項(且必須在第一行定義,當類初始化時,這些列舉值會被例項化)。
由於這些列舉值的例項化是在類初始化階段,所以應該將列舉類的構造器(如果存在),採用private宣告(這種情況下預設也是private)。
另外補充一點,由於JVM類初始化是執行緒安全的,所以可以採用列舉類實現一個執行緒安全的單例模式。
參考程式碼:
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;
}
}