public enum Light { RED, GREEN, YELLOW; }
咱們只可以表示出紅燈、綠燈和黃燈,可是具體的值咱們沒辦法表示出來。 java
別急,既然枚舉類型提供了構造函數,咱們能夠經過構造函數和覆寫toString方法來實現 ide
首先給Light枚舉類型增長構造方法,而後每一個枚舉類型的值經過構造函數傳入對應的參 函數
數, 同時覆寫toString方法,在該方法中返回從構造函數中傳入的參數,代碼如下: 性能
public enum Light { RED("紅燈"), GREEN("綠燈"), YELLOW("黃燈"); private String code; private Light(String code) { this.code = code; } // @Override // public String toString() { // return String.valueOf(this.code); // } } class EnumTest{ public static void main(String[] args) { System.out.println("============演示枚舉類型的遍歷:"); testListEnum(); } static void testListEnum(){ Light[] allLight = Light.values(); for (Light light:allLight) { System.out.println("當前燈name:"+light.name()); System.out.println("當前燈順序:"+light.ordinal()); System.out.println("當前燈:"+light); } } }
常量和枚舉的區別: 優化
public interface ConstInterfaceA { public static final String CONST_A = "aa"; public static final String CONST_C = "ac"; }
存在問題: this
1) 沒法限制開發員繼承/實現接口. spa
2) 常量做爲參數時,是String,int等弱類型,開發員傳入沒有在常量接口裏定義的值,這個問題沒法經過編譯器發現. code
3) 因爲開發員能夠直接寫常量值, 因此不能用==對比,只能用equals對比,不能優化性能 繼承
4) 編譯時,是直接把常量的值編譯到類的二進制代碼裏,常量的值在升級中變化後,須要從新編譯全部引用常量的類,由於裏面存的是舊值. 接口
public class ConstClassA { public static final String CONST_A = "aa"; public static final String CONST_C = "ac"; private ConstClassA() { } }
常量類能夠設置構造函數爲private,從而限制繼承,也就沒有繼續添加常量的問題了.
可是其餘問題與常量接口同樣沒法解決!
枚舉類型解決了以上全部問題,主要體如今:
1) 私有構造函數,避免被繼承和擴展.
2) 定義方法的參數時,必須用枚舉常量類類型,如上面的EnumClassA類型,這樣就轉變成了強類型,不會出現弱類型引發的問題.
3) 常量值地址惟一,能夠用==直接對比,性能會有提升.
4) 編譯時,沒有把常量值編譯到代碼裏,即便常量的值發生變化也不會影響引用常量的類.