1. 程式人生 > >Java中繼承java.lang.Enum

Java中繼承java.lang.Enum

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; } }