免責事項: これは知的な演習としての質問であるため、ここでは Enum を使用したくありません。
以前の質問: Java: Lazy loading Singleton とリフレクション攻撃を参照してください。
以下は、IODHイディオムのリフレクション攻撃を防ぐために私が思いついた解決策です。よろしいですか?解決策についてコメントし、他のアプローチを提案しますか? (「許可」アプローチを認識しています: https://stackoverflow.com/a/8112238/266103 )
繰り返しますが、このコードは厳密に知的な演習として意図されたものであり、私はこのようなものを実際の生活で使用することは決してありません.
また、1) このコードは 2 つのインスタンスを作成しますが、呼び出しではなくコンストラクター リフレクションによってインスタンスが作成された場合、2 番目のインスタンスを保持します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;
}
}