枚舉類Enum:Core Java 5.6

類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 ...
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章