前面文章讲到的单例都可以通过反射破坏,这里就有枚举式单例来解决
public enum EnumSinletion {
SINGLETION ;
public static EnumSinletion getSingletion(){
return SINGLETION;
}
}
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) {
try{
Class c = EnumSinletion.class;
Constructor constructor = c.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Object c1 = constructor.newInstance();
Object c2 = constructor.newInstance();
System.out.println(constructor);
}catch (Exception e){
e.printStackTrace();
}
}
}
通过测试就能发现在通过反射实例化的时候就会抛出异常
java.lang.IllegalArgumentException: Cannot reflectively create enum objects。
所以枚举式单例就解决了通过反射来破坏单例。
细心的朋友可能会发现,这么一改,又存在饿汉式的缺点,就是内存浪费。
通过查看Enum类中的valueOf方法,可以看出通过一个map来存放
这里留个思考,除了通过反射破坏单例,还存在其他方式破坏单例吗?