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