枚舉實現單例模式(4)

1. 枚舉創建單例模式

import java.lang.reflect.Constructor;

/**
 * @author xiyou
 * 枚舉實現單例模式
 * 至於爲什麼枚舉能實現單例模式,有興趣的夥伴可以深度學習一下
 * SpirngIOC是單例 是枚舉的升級,是懶漢模式
 */
public enum EnumSingleton {

    /**
     *
     */
    INSTANCE;
    private Object data;

    private Object getData() {
        return data;
    }

    private void setData(Object data) {
        this.data = data;
    }

    private static EnumSingleton getInstance() {
        return INSTANCE;
    }


    public static void main(String[] args) {
        /**
         *         System.out.println(EnumSingleton.getInstance());
         *         System.out.println(EnumSingleton.getInstance());
         *         System.out.println(EnumSingleton.getInstance());
         *         System.out.println(EnumSingleton.getInstance());
         */
        Object instance = EnumSingleton.getInstance();
        System.out.println(instance);
        //通過非正常手段,反射來破壞單例
        Class<?> oneClass = EnumSingleton.class;
        try {
            Constructor c = oneClass.getDeclaredConstructor(String.class, int.class);
            c.setAccessible(true);
            Object instance1 = c.newInstance("xiyou", 666);
            Object instance2 = c.newInstance("xiyou2", 6662);
            System.out.println(instance1);
            System.out.println(instance2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



2. 測試反射破壞單例的結果

發現不能破壞,結果如下:

INSTANCE
java.lang.IllegalArgumentException: Cannot reflectively create enum objects
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章