2012-01-27 67 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(); 
    } 
}