我正在查看以下代码,其中我对 FlowSpaceImpl类的空白构造函数感到困惑。由于构造函数是私有的,并且FlowSpaceImpl实例被设置为静态和私有,因此其显而易见的开发人员只需要此类的一个实例。但是当调用新的FlowSpaceImpl()时,如何在第一个位置初始化FlowSpaceImpl类的对象。对于代码审核,您可以查看FlowSpaceImpl实施
public class FlowSpaceImpl implements FlowSpace {
private static FlowSpaceImpl instance = null;
private FlowSpaceImpl() {}
private static FlowSpaceImpl getInstance() {
if (instance == null)
instance = new FlowSpaceImpl();
return instance;
}
}
答案 0 :(得分:2)
您的实例变量是static
,实例构造函数没有用。这是初始化变量
private static FlowSpaceImpl getInstance() {
if (instance == null) {
instance = new FlowSpaceImpl();
}
return instance;
}
因此,当调用getInstance
时,如果它是null
,则会在返回之前对其进行初始化。
请注意,此代码不是线程安全,因此非常非常糟糕。
编写线程安全单例的普遍接受的方法是:
public class FlowSpaceImpl implements FlowSpace {
public static FlowSpaceImpl getInstance() {
return InstanceHolder.INSTANCE;
}
private static class InstanceHolder {
private static final FlowSpaceImpl INSTANCE = new FlowSpaceImpl();
}
private FlowSpaceImpl() {
}
}
此代码利用Java语言规范中的原子性保证来确保线程安全。更多信息here。