下面列出的班级是单身人士吗?由于构造函数被声明为public,我可以推断该类是一个错误实现的单例吗?
public class CreateDevice extends Functionality{
private static Simulator simulator;
ConnectionDB connect = ConnectionDB.getInstance();
public CreateDevice(Simulator simulator){
this.simulator = simulator;
}
private static CreateDevice instance;
synchronized public static CreateDevice getInstance() {
if(instance == null){
instance = new CreateDevice(simulator);
}
return instance;
}
}
答案 0 :(得分:7)
总之 - 没有。由于构造函数是public
,任何人都可以随时随地创建它的新实例。使构造函数private
应该解决问题,并将类转换为单例。
答案 1 :(得分:2)
我会说你说这在当前的实现中不是Singleton是正确的。
您需要将构造函数设置为私有(通常是这样做),或者如果由于遗留原因需要公共构造函数,则应创建一个构造函数来检查实例是否为null,如果实例为null,则抛出异常它已经存在或通过调用另一个私有构造函数创建它,将其分配给实例,然后返回它。第一种选择是可取的,但是对于大多数重构过于昂贵的项目而言,其他选项都可行。
答案 2 :(得分:1)
你可以把它变成单身,但是你需要找到另一种方法将模拟器注入其中。
在当前实现中,模拟器是在第一次有人调用构造函数时设置的。该构造函数非常奇怪,因为它设置了一个静态字段。它还将立即打开一个连接,与单例实例使用的连接分开。
如果在构造函数被调用至少一次之前调用了getInstance()方法,则永远不会设置模拟器。
要使其成为正确的单例,您可以删除构造函数并添加私有的无参数构造函数。您还需要一个静态setSimulator()方法来设置静态字段,并确保在需要与模拟器进行任何其他交互之前调用它。
如果您在单例之间存在依赖关系,我建议您使用Inversion-of-Control模式,其中IoC容器创建服务对象并将它们连接在一起。