2012-01-27 16 views
2

私はJavaでシングルトンの概念を知っています。 Javaの内部クラスとしてシングルトンを作成する際に問題があります。ホルダーに問題が発生しましたJavaシングルトンの内部クラス

public class NormalClass { 
    private class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

     public static Singleton getInstance() { 
      return NormalClass.Singleton.SingletonHolder.sessionData; 
     } 
    } 

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 

エラーは新しいSingleton()コンストラクター呼び出し時です。内部クラスとしてのシングルトンのプライベートコンストラクタを適切に呼び出す方法は?

参考にする

答えて

7

シングルトンクラスを静的にする必要があります。その後、コンストラクタを呼び出すことができます。

コンストラクタ呼び出しが機能しない理由は、Java nested classesチュートリアルで説明されています。基本的に、内部クラスは構築する前に外部クラスのインスタンスを必要とします:

private static Singleton sessionData = new NormalClass().new Singleton(); 
2

静的クラスを非静的クラス内で宣言することはできません。 Singletonクラスを静的にし、すべてをコンパイルするだけです。

1

問題は、オンデマンド

public class NormalClass { 
    private static class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

     public static Singleton getInstance() { 
      return NormalClass.Singleton.SingletonHolder.sessionData; 
     } 
    } 

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 
0

初期....ジョシュア・ブロック..私はあなたの内部クラスが静的なものである場合を考える

、内部クラスがstatic内部クラスではないということです、あなたのホルダークラスも静的でなければなりません。

private static class SingletonHolder { 
    static final Singleton instance = new Singleton(); 
} 

または、これはどうしてですか?なぜインナーホルダークラスですか?

public class NormalClass{ 
    private static class InnerClass{ 
    private static InnerClass instance = null; 
    private InnerClass(){} 
    public static InnerClass getInstance() { 
    if(null==NormalClass.InnerClass.instance){ 
    NormalClass.InnerClass.instance = new InnerClass(); 
    } 
    return NormalClass.InnerClass.instance; 
} 
    } 

    public void test(){ 
    InnerClass.getInstance(); 
    } 
} 
関連する問題