Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java单例内部类_Java_Singleton_Inner Classes - Fatal编程技术网

Java单例内部类

Java单例内部类,java,singleton,inner-classes,Java,Singleton,Inner Classes,我知道Java中单例的概念。 我在Java中将singleton创建为内部类时遇到问题。问题发生在持有者的位置 public class NormalClass { private class Singleton { private static Singleton instance = null; private Singleton() { } private static class SingletonHolder

我知道Java中单例的概念。 我在Java中将singleton创建为内部类时遇到问题。问题发生在持有者的位置

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


关于

如果它应该是一个真正的单例类,请将单例类设置为静态。然后您将能够调用构造函数

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

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

不能在非静态类中声明静态类。将
单例
类设为静态,所有内容都应该可以正常编译。

问题在于内部类不是静态的内部类

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

按需初始化。。。。约书亚·布洛赫

我认为如果你的内部类是静态的,那么你的holder类也应该是静态的

private static class SingletonHolder {
    static final Singleton instance = new Singleton();
}
或者为什么不这样呢?为什么是内部holder类

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