2012-01-27 25 views
2

我知道Java中單例的概念。 我在創建singleton作爲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()構造函數調用中。如何正確調用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

初始化點播....約書亞布洛赫..

我認爲,如果你的內部類是靜態的,你的持有人類也應該是靜態的。

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(); 
    } 
}