java - 非最终实例的线程安全延迟初始化

标签 java static initialization thread-safety lazy-loading

我看过这个答案here展示如何对静态最终单例进行线程安全的延迟初始化。

但是,如果您延迟加载的类不是最终的,那么最好的解决方案是什么? (它有一些你创建后要调用的方法)

将方法调用放在静态 block 中是否安全?

public class Something {

    private static class LazyHolder {
            public static final Something INSTANCE = new Something();
            static {
                    INSTANCE.setValue("foo");
            }
    }

    public static Something getInstance() {
            return LazyHolder.INSTANCE;
    }
}

最佳答案

这是 IODH(按需初始化方法)惯用语。

But what is the best solution if the class you are lazy loading isn't final? (It has some methods you want to call after creating it)

您的“实例”是否是最终的并不重要。它将被延迟加载(当您第一次调用 getInstance 方法时)。
将 INSTACE 设置为 Final 的目的是确保,它始终指向一种对象,但您可以自由修改对象属性。

关于java - 非最终实例的线程安全延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60843501/

相关文章:

Firebase 中的 Java 服务器未将信息推送到数据库

java - 为什么静态变量被认为是邪恶的?

c++ - 如何在多个类中传递一个静态对象?

c - 在函数的返回语句中创建的结构体数据可在调用函数中使用

java - JSwing - 从构造函数中调用子例程不会初始化数组(它应该这样做)

objective-c - BOOL 的默认值

java - 如何使用 gradle 应用程序插件运行具有多个包的项目?

java - JTable 和迭代绑定(bind) ObservableList

java - 什么是 NullPointerException,我该如何解决?

swift - 自动初始化器继承的条件是初始化器的签名