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

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

前面我們說到序列化和反序列化以及反射對單例都是有破壞的嗦哆,下面我們介紹一種更加優(yōu)雅的實現(xiàn)燕鸽,也是effective java中推薦的實現(xiàn)方式,枚舉實現(xiàn)單例模式敬拓。話不多說我們直接看代碼吧邻薯。

public enum EnumInstance {
    INSTANCE{
        protected  void printTest(){
            System.out.println("redstar Print SingletonTest");
        }
    };
    protected abstract void printTest();
    private Object data;

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
    public static EnumInstance getInstance(){
        return INSTANCE;
    }

}

然后我們看看測試類

public class SingletonTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    
    EnumInstance instance = EnumInstance.getInstance();
        instance.setData(new Object());

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton_file"));
        oos.writeObject(instance);

        File file = new File("singleton_file");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        EnumInstance newInstance = (EnumInstance) ois.readObject();
        
        
        
        System.out.println(instance.getData());
        System.out.println(newInstance.getData());
        System.out.println(instance.getData() == newInstance.getData());
    }

這里返回的結果是true,然后我們測試一下反射去獲取這個對象乘凸。

public class SingletonTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class objectClass = EnumInstance.class;
        Constructor constructor = objectClass.getDeclaredConstructor(String.class,int.class);
        constructor.setAccessible(true);
        EnumInstance instance = (EnumInstance) constructor.newInstance("redstar",666);
}

運行結果報異常

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)

我們點擊進去查看一下417行的代碼

        if ((clazz.getModifiers() & Modifier.ENUM) != 0)
            throw new IllegalArgumentException("Cannot reflectively create enum objects");
        ConstructorAccessor ca = constructorAccessor; 

從這里我們可以看到jdk底層就為我們對反射進行處理了厕诡。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市营勤,隨后出現(xiàn)的幾起案子灵嫌,更是在濱河造成了極大的恐慌,老刑警劉巖葛作,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寿羞,死亡現(xiàn)場離奇詭異,居然都是意外死亡赂蠢,警方通過查閱死者的電腦和手機绪穆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱岂,“玉大人玖院,你說我怎么就攤上這事×抗希” “怎么了司恳?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵途乃,是天一觀的道長绍傲。 經(jīng)常有香客問我,道長耍共,這世上最難降的妖魔是什么烫饼? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮试读,結果婚禮上杠纵,老公的妹妹穿的比我還像新娘。我一直安慰自己钩骇,他們只是感情好比藻,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布铝量。 她就那樣靜靜地躺著,像睡著了一般银亲。 火紅的嫁衣襯著肌膚如雪慢叨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天务蝠,我揣著相機與錄音拍谐,去河邊找鬼。 笑死馏段,一個胖子當著我的面吹牛轩拨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播院喜,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼亡蓉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喷舀?” 一聲冷哼從身側響起寸宵,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎元咙,沒想到半個月后梯影,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡庶香,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年甲棍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶掖。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡感猛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奢赂,到底是詐尸還是另有隱情陪白,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布膳灶,位于F島的核電站咱士,受9級特大地震影響,放射性物質發(fā)生泄漏轧钓。R本人自食惡果不足惜序厉,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毕箍。 院中可真熱鬧弛房,春花似錦、人聲如沸而柑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粹排,卻和暖如春颅围,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恨搓。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工院促, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斧抱。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓常拓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辉浦。 傳聞我的和親對象是個殘疾皇子弄抬,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 枚舉單例(Enum Singleton)是實現(xiàn)單例模式的一種新方式,盡管單例模式在java中已經(jīng)存在很長時間了宪郊,但...
    淡淡的傷你閱讀 1,176評論 0 3
  • 單例模式(SingletonPattern)一般被認為是最簡單掂恕、最易理解的設計模式,也因為它的簡潔易懂弛槐,是項目中最...
    成熱了閱讀 4,231評論 4 34
  • 反復強調懊亡,自制是思想控制的結果! 自我暗示在你自己的頭腦中裝入你所希望裝入的思想乎串,排斥所有別人通過暗示...
    清凈平等正覺閱讀 450評論 0 1
  • 2016年4月8日早上8點左右店枣,年輕人下班回家的路上,說是近期工作到月底應該有個項目叹誉,需要緊張三個周鸯两,工作小...
    田園牧歌123閱讀 125評論 0 0
  • 章節(jié)梗概 對于一個項目經(jīng)理,藍色績效在三角形的頂端长豁,橙色在基礎底端钧唐,成本和時間分列兩側。在藍色心態(tài)下匠襟,以績效為目標...
    哆啦A孟君閱讀 269評論 0 0