Java单例内部类

时间:2012-01-27 09:30:53

标签: java singleton inner-classes

我知道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的私有构造函数作为内部类?

此致

4 个答案:

答案 0 :(得分:7)

如果它应该是一个真正的单例,请使你的单例类静态。然后你就可以调用构造函数了。

Java nested classes教程解释了构造函数调用不起作用的原因。基本上,内部类在构造之前需要外部类的实例:

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

答案 1 :(得分:2)

您不能在非静态类中声明静态类。使Singleton类保持静态,一切都应该编译得很好。

答案 2 :(得分: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();
  }
}

答案 3 :(得分:0)

按需初始化...... Joshua Bloch ..

我认为如果你的内部类是静态的,你的持有者类也应该是静态的。

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