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