Java 静电场和单态子的问题

Java 静电场和单态子的问题,java,singleton,Java,Singleton,我有两门课: public class Singleton{ private Singleton(){...} private static class InstanceHolder{ private static final Singleton instance=new Singleton(); } public static Singleton getInstance(){ return InstanceHolder.ins

我有两门课:

public class Singleton{
    private Singleton(){...}

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

    public static Singleton getInstance(){
        return InstanceHolder.instance;
    }
}

问题

如果在某个地方(实际上,在另一个单例类构造函数中)我使用如下内容:

private final Singleton singleton=Someclass.getSingleton();
我的
单例
始终为空


问题为什么?

您的示例运行良好,因此不完整

也许在实际应用程序中,类之间有一个依赖循环,因此在
Someclass
初始化完成之前调用
getSingleton()
,如下所示,但涉及多个类:

public class Foo {
    private static Foo INSTANCE = new Foo(); // Prints null
    private static String s = "foo";

    public Foo() {
        System.out.println(s);
    }
}
如果您以这种方式实现了多个相互依赖的单例,那么这种情况尤其可能发生。 试着找出并简化这些循环


另外,使用某种DI或服务定位器模式可能比手动实现单例行为更好。

您应该在第一次调用
getInstance()
时创建单例实例,而不是静态地创建。无论依赖关系周期如何,这都将起作用

public class Singleton {
  private static Singleton instance = null;

  private Singleton(){...}

  public static Singleton getInstance() {
    if(instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}

如果您在构造函数之外执行它,它会工作吗?在
Singleton
类中,作者已经使用staticholder习惯用法这样做了。问题在其他类中。但实例是在原始帖子中静态创建的。在我看来不是。这确保在所有静态初始化之后创建实例。(除非有
private static Singleton s=Singleton.getInstance()
之类的东西。我认为最好是让getInstance同步。
public class Singleton {
  private static Singleton instance = null;

  private Singleton(){...}

  public static Singleton getInstance() {
    if(instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}