類Enum
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
private final String name;
private final int ordinal; //序號
//構造函數
protected Enum(String name, int ordinal){
this.name = name; this.ordinal = ordinal;
}
public static <T extends Enum<T>>T valueOf(Class<T> enumType, String name){
T result = enumType.getConstantDirectory().get(name); // 獲取類的所有常量,然後從中找出名稱爲name的。
if(result != null) return result;
...
}
public final String name(){ return name;}
public final int ordinal(){ return ordinal;}
public String toString(){ return name;}
}
所有枚舉類都是Enum類的子類
public enum Size{
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
在用關鍵字enum定義枚舉類時,javac編譯器會自動將Size類聲明爲Enum類的子類。等同於如下代碼:
public final class Size extends Enum<Size>{
private Size(String name,int ordinal){
super(name, ordinal);
}
public static final Size SMALL = new Size("SMALL", 0);
public static final Size MEDIUM = new Size("MEDIUM", 1);
public static final Size LARGE = new Size("LARGE", 2);
public static final Size EXTRA_LARGE = new Size("EXTRA_LARGE", 3);
}
每個枚舉值是對枚舉類的一個實例對象的引用
上例代碼可以看出,其聲明瞭一個枚舉類,它有且只會有四個實例對象,分別由SMLL…四個常量引用。
定義自己的域和方法
自定義的枚舉類既然是Enum類的子類,自然也是可以擴展出自己的實例域和方法的,
但是其構造函數必須是private的,因爲其只能有常量型的實例對象,
其實例對象常量必須在類的第一行定義,並且以分號結束,沒有其他代碼時可以不以分號結尾:
public enum Size{
SMALL("S"),LARGE("L"), ...;
private String abbreviation; // 縮寫
private Size(String abbr){
this.abbreviation = abbr;
}
public String getAbbr(){
return abbreviation;
}
}
枚舉類型在單例模式中的應用
因爲枚舉類的實例必須且只能在定義類的時候就聲明和初始化,因此應用於單例模式非常合適。
public enum Singleton{
INSTANCE; // 需要引用此實例時,直接Singleton.INSTANCE即可。
private Singleton(){
// init code ...
}
}