gpt4 book ai didi

java - 单例类的对象是如何初始化的?

转载 作者:行者123 更新时间:2023-12-02 06:59:10 24 4
gpt4 key购买 nike

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



}

最佳答案

你的实例变量是静态,实例构造函数没有用。这是初始化变量的代码

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 .

关于java - 单例类的对象是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com