java 枚舉的原理與使用枚舉設計單例__java

來源:互聯網
上載者:User
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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.