gpt4 book ai didi

java - 带参数的单例

转载 作者:行者123 更新时间:2023-11-30 03:22:43 24 4
gpt4 key购买 nike

让一个在其静态构造函数中接受参数的单例是个好主意吗?我会遇到并发问题吗?

public class DataHelper {
private static DataHelper singleton = null;
private Listener<Object> listener;

public static DataHelper getInstance(Listener<Object> listener) {
if(singleton == null) {
singleton = new DataHelper();
}
singleton.listener = listener;

return singleton;
}
}

最佳答案

虽然它可能不错(取决于您的需要),但绝对不是一个好主意。既然在调用 getInstance() 时已经有了一个“监听器”对象,为什么不将它作为参数传递给单例的成员函数呢?您的函数中有两个竞争条件,一个是在创建 Singleton 时,另一个是在设置“监听器”成员变量时。第二个可以通过根本不传递参数来避免。即使在单线程环境下,你也有问题

void foo() {
DataHelper dh = DataHelper.getInstance(listener1);
bar();
// dh.listener no longer points to listener1
}

void bar() {
DataHelper dh = DataHelper.getInstance(listener2);
}

如果有帮助,您还应该阅读有关依赖注入(inject)的内容。

关于java - 带参数的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816658/

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