下面列出的类是单身人士吗?由于构造函数被声明为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; } }
解决方法
你可以把它变成单身,但是你需要找到另一种方法将模拟器注入其中.
在当前实现中,模拟器是在第一次有人调用构造函数时设置的.该构造函数非常奇怪,因为它设置了一个静态字段.它还将立即打开一个连接,与单例实例使用的连接分开.
如果在构造函数至少调用一次之前调用了getInstance()方法,则永远不会设置模拟器.
要使它成为一个合适的单例,你可以删除构造函数并添加一个私有的无参数构造函数.您还需要一个静态setSimulator()方法来设置静态字段,并确保在需要与模拟器进行任何其他交互之前调用它.
如果您在单例之间存在依赖关系,我建议您使用Inversion-of-Control模式,其中IoC容器创建服务对象并将它们连接在一起.