Singleton With Arguments

时间:2013-09-15 19:35:42

标签: java android design-patterns singleton

让Singleton在其静态构造函数中接受参数是一个好主意吗?我可以有并发问题吗?

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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

如果有帮助,你应该阅读有关依赖注入的信息。

答案 1 :(得分:0)

向Singleton添加参数不会引入竞争条件(除非您传递对共享对象的引用)。但是,这种实现已经具有竞争条件。什么可以防止两个线程同时调用该方法?单身人士没有受到保护。