免责声明:这是一个作为智力练习的问题,因此我不想在这里使用 Enum。
参考我之前的问题: Java:延迟加载Singleton和反射攻击?
以下是我提出的防止 IODH 惯用语反射攻击的解决方案。你能请。评论解决方案并提出其他方法?(我知道“许可”方法:https ://stackoverflow.com/a/8112238/266103 )
同样,这段代码严格来说是一种智力练习,我永远不会在现实生活中使用这样的东西。
另外 1) 此代码创建两个实例,但如果实例是通过构造函数反射而不是调用创建的,则保留第二个实例,getInstance()
并且 2) 它不太可能是线程安全的。
public class Singleton
{
private volatile static boolean isCreated = false;
private static class Holder
{
private static Singleton instance = new Singleton();
}
private Singleton()
{
if(isCreated)
{
throw new RuntimeException("Singleton Multiple Instantiation");
}
Holder.instance = this;
isCreated = true;
}
public static Singleton getInstance()
{
return Holder.instance;
}
}