国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
枚舉實現(xiàn)單例模式

1.引言

單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法
????????????????????? -- 出自 《effective java》

2.單例模式的特點

  • 單例模式三個主要特點:
    1、構(gòu)造方法私有化;
    2、實例化的變量引用私有化;
    3、獲取實例的方法共有。

3. 常用的單例模式

1.單例的餓漢模式

 1   public class Singleton { 2     /* 3      * 利用靜態(tài)變量來記錄Singleton的唯一實例 4      * 直接初始化靜態(tài)變量,這樣就可以確保線程安全了 5      */ 6     private static Singleton uniqueInstance = new Singleton(); 7 8     /* 9      * 構(gòu)造器私有化,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器10      */11     private Singleton(){1213     }1415     public static Singleton getInstance(){16         return uniqueInstance;17     }1819 }

2.懶漢的雙重加鎖機制

 1 public class Singleton { 2     /* 3      * 利用靜態(tài)變量來記錄Singleton的唯一實例 4      * volatile 關(guān)鍵字確保:當uniqueInstance變量被初始化成Singleton實例時, 5      * 多個線程正確地處理uniqueInstance變量 6      * 7      */ 8     private volatile static Singleton uniqueInstance; 910     /*11      * 構(gòu)造器私有化,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器12      */13     private Singleton(){1415     }1617     /*18      *19      * 檢查實例,如果不存在,就進入同步區(qū)域20      */21     public static Singleton getInstance(){22         if(uniqueInstance == null){23             synchronized(Singleton.class){    //進入同步區(qū)域24                 if(uniqueInstance == null){     //在檢查一次,如果為null,則創(chuàng)建25                     uniqueInstance  = new Singleton();26                 }27             }28         }2930         return uniqueInstance;31     }3233 }

3.靜態(tài)內(nèi)部類

public class Singleton {        private static class LazyHolder {           private static final Singleton INSTANCE = new Singleton();        }        private Singleton (){}        public static final Singleton getInstance() {           return LazyHolder.INSTANCE;        }    }

4.為什么使用單例

4.1 私有化構(gòu)造器并不保險

    《effective java》中只簡單的提了幾句話:“享有特權(quán)的客戶端可以借助AccessibleObject.setAccessible方法,通過反射機制調(diào)用私有構(gòu)造器。如果需要低于這種攻擊,可以修改構(gòu)造器,讓它在被要求創(chuàng)建第二個實例的時候拋出異常。

4.2序列化問題

    任何一個readObject方法,不管是顯式的還是默認的,它都會返回一個新建的實例,這個新建的實例不同于該類初始化時創(chuàng)建的實例。”當然,這個問題也是可以解決的,想詳細了解的同學可以翻看《effective java》第77條:對于實例控制,枚舉類型優(yōu)于readResolve

4.3 枚舉單例示例

public enum  EnumSingleton {    INSTANCE;    public EnumSingleton getInstance(){        return INSTANCE;    }}

完整的枚舉單例

public class User {    //私有化構(gòu)造函數(shù)    private User(){ }     //定義一個靜態(tài)枚舉類    static enum SingletonEnum{        //創(chuàng)建一個枚舉對象,該對象天生為單例        INSTANCE;        private User user;        //私有化枚舉的構(gòu)造函數(shù)        private SingletonEnum(){            user=new User();        }        public User getInstnce(){            return user;        }    }     //對外暴露一個獲取User對象的靜態(tài)方法    public static User getInstance(){        return SingletonEnum.INSTANCE.getInstnce();    }}public class Test {    public static void main(String [] args){        System.out.println(User.getInstance());        System.out.println(User.getInstance());        System.out.println(User.getInstance()==User.getInstance());    }}結(jié)果為true

5.總結(jié)

至此,相信同學們應(yīng)該能明白了為什么Joshua Bloch說的“單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法”了吧。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
設(shè)計模式讀書筆記-----單例模式
面試被問設(shè)計模式?不要怕看這里:單例模式
設(shè)計模式--單例模式
5.2.3 單例模式示例代碼
深入靈魂的考驗,每行注釋都是靈魂的單例模式,源碼+實例降臨
C# 設(shè)計模式-單例模式
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服