1.一個簡單的季節枚舉
//1.季節枚舉類,不能再繼承其它類 public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; } //2.main測試 public class TestEnums { public static void main(String [] a){ //在列印輸出SeasonEnum.SPRING時,調用了toString()方方法,枚舉預設是重寫了toString()方法,直接返回常量名(name) System.out.println(SeasonEnum.SPRING); } } //輸出結果是:SPRING
2.SeasonEnum季節枚舉的底層實現
//SeasonEnum 預設繼承Enum ,所以SeasonEnum不能再繼承其它類 public final class SeasonEnum extends Enum { //1.枚舉對象 public static final SeasonEnum SPRING; public static final SeasonEnum SUMMER; public static final SeasonEnum FALL; public static final SeasonEnum WINTER; private static final SeasonEnum ENUM$VALUES[]; //3.私人化構造器,所以枚舉對象預設是不能new擷取 private SeasonEnum(String s, int i) { super(s, i); } public static SeasonEnum[] values() { SeasonEnum aseasonenum[]; int i; SeasonEnum aseasonenum1[]; System.arraycopy(aseasonenum = ENUM$VALUES, 0, aseasonenum1 = new SeasonEnum[i = aseasonenum.length], 0, i); return aseasonenum1; } //4.通過s可以擷取枚舉 public static SeasonEnum valueOf(String s) { return (SeasonEnum)Enum.valueOf(com/xmg/enums/SeasonEnum, s); } //2.執行個體化枚舉對象 static { SPRING = new SeasonEnum("SPRING", 0);//第一個參數是:常量名,第二個參數是:常量的索引 SUMMER = new SeasonEnum("SUMMER", 1); FALL = new SeasonEnum("FALL", 2); WINTER = new SeasonEnum("WINTER", 3); ENUM$VALUES = (new SeasonEnum[] { SPRING, SUMMER, FALL, WINTER }); } }
總結:
枚舉中定義的常量,引用的是一個枚舉的對象,對象是通過預設的私人化構造器執行個體化 3.SeasonEnum季節枚舉的簡單使用
public class TestEnums { public static void main(String [] a){ System.out.println(SeasonEnum.SPRING);//輸出結果是:SPRING SeasonEnum summer = SeasonEnum.SUMMER;//執行個體化一個枚舉對象 //switch底層比較的是常量所在的索引 switch (summer) {//jdk1.5的switch支援枚舉的比較:傳入枚舉對象 case SUMMER://枚舉的常量 System.out.println(summer);//輸出結果是:SUMMER break; default: break; } //if底層比較的是枚舉的引用 if(summer==SeasonEnum.SUMMER){//是true System.out.println(summer);//輸出結果是:SUMMER } } } //執行main輸出的結果是: SPRING SUMMER SUMMER
底層實現的原理
public class TestEnums { public static void main(String a[]) { System.out.println(SeasonEnum.SPRING); SeasonEnum summer = SeasonEnum.SUMMER; //summer.ordinal()方法的作用就是去擷取SUMMER常亮在枚舉數組中的索引,傳回值是2 switch ($SWITCH_TABLE$com$xmg$enums$SeasonEnum()[summer.ordinal()]) { case 2: // '\002' System.out.println(summer); break; } if (summer == SeasonEnum.SUMMER) System.out.println(summer); } ..... ..... ..... ..... }
總結
枚舉的比較,其實比較的是:索引和引用,而不是常量的名稱 4.枚舉的常量也可以使用中文
//枚舉類 public enum SeasonEnum2 { 春天,夏天,秋天,冬天; } //測試類別 public class TestEnums2 { public static void main(String [] a){ System.out.println(SeasonEnum2.春天);//輸出結果是:春天 SeasonEnum2 summer = SeasonEnum2.夏天;//執行個體化一個枚舉對象 //switch底層比較的是常量所在的索引 switch (summer) {//jdk1.5的switch支援枚舉的比較:傳入枚舉對象 case 夏天://枚舉的常量 System.out.println(summer);//輸出結果是:夏天 break; default: break; } //if底層比較的是枚舉的引用 if(summer==SeasonEnum2.夏天){ System.out.println(summer);//輸出結果是:夏天 } } } //輸出的結果: 春天 夏天 夏天
總結
枚舉的比較,其實比較的是:索引和引用,而不是常量的名稱 5.自訂構造器,實現值得比較
//自訂一個是否使用硬碟緩衝的枚舉 public enum DiskCacheEnum { //常量名(在執行個體化枚舉對象時,給構造器傳遞參數) TRUE(true),FALSE(false); //自訂boolean欄位 private final boolean isDiskCache; //自訂構造器,預設都是私人(當調用DiskCacheEnum.TRUE時,就會調用該構造器) DiskCacheEnum(boolean isDiskCache){ this.isDiskCache=isDiskCache; } //擷取欄位的值 public boolean isDiskCache() { return isDiskCache; } } //測試(比較欄位的值,而不是比較枚舉的“引用和索引”) public static void main(String [] a){ DiskCacheEnum diskCacheEnum = DiskCacheEnum.TRUE; System.out.println(diskCacheEnum);//輸出:TRUE if(diskCacheEnum.isDiskCache()){//判斷布爾值的欄位的值是否為true System.out.println(diskCacheEnum.isDiskCache());//輸出布爾值的:true } }
總結
這樣就可以實現通過建立一個枚舉(使用枚舉的值)來與從資料庫擷取的值進行比較 6.用枚舉設計單例
餓漢式單例:
class SingleTon { private static SingleTon instance=new SingleTon(); private SingleTon(){} public static SingleDemo getInstance(){ return instance; } } //單例對象的擷取: SingleTon instance = SingleTon.getInstance();
通過枚舉實現餓漢式單例:
public enum SingleTon { INSTANCE; } //單例對象的擷取: SingleTon instance = SingleTon.INSTANCE;