0

我正在查看以下代码,其中我对FlowSpaceImpl 类的空白构造函数感到困惑。由于构造函数是私有的,而 FlowSpaceImpl 实例被设置为静态和私有的,因此很明显开发人员只需要一个此类实例。但是当调用 new 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;
            }



}
4

1 回答 1

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 语言规范中的原子性保证来确保线程安全。更多信息在这里

于 2013-06-02T14:03:07.497 回答