我一直读到单例模式是一种反模式等等。但我花了将近一天的时间才发现,一个类在构造中有类似循环依赖的东西,导致多个对象,而应用程序只允许一个对象.这就是为什么我想验证这种情况再也不会发生,并且不知道如果没有单例模式该怎么做。
public class Application {
private SingletonModule module;
public void getModule() {
if(module == null) {
module = new SingletonModule(getDependency());
}
return module;
}
private Dependency getDependency() {
return new Dependency(getModule());
}
}
public class Dependency {
public Dependency(SingletonModule module) {
System.out.println(module.getAttribute()); // is more complex of course...
}
}
public class SingletonModule {
public Dependency dep;
public String attribute;
public SingletonModule(Dependency dep) {
this.dep=dep;
}
public String getAttribute() {
return attribute;
}
}
没有问题是 getModule()
是从外部调用的,即
public class Runner {
public Runner() {
Application app = new Application();
app.getModule().getAttribute();
}
}
最佳答案
构造函数可以检查:
public class OnlyOne {
static count = 0;
public OnlyOne() {
if (count > 0) throw ...
count++;
...
}
}
或工厂方法:
public class OnlyOne {
static count = 0;
public static OnlyOne make() {
if (count > 0) throw ...
count++;
return new OnlyOne();
}
private OnlyOne() { ...}
}
更新: 理想情况下,此类的创建应该非常简单,例如,当程序启动然后作为依赖项传递时,不需要进行此检查。但是,如果创建发生在更复杂的情况下,就像我假设你的那样,那么这是一个有用的安全检查。
关于java - 如何在没有单例模式的情况下强制构造函数只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968443/