9

我正在尝试使用 Java 枚举实现单例。

但是我也想在第一次初始化时将一些参数传递给构造函数。

我该如何做到这一点?使用带参数的单例是一个好习惯吗?

public enum DaoManager {
    INSTANCE;
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    public void init(ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }

现在我正在使用 init 方法将记录器和数据库池传递给 DaoManager。

但是,如果客户端未能调用 init() 方法,那么很有可能会失败。

有人可以指导我如何做到这一点吗?

4

3 回答 3

6

考虑 :

public enum DaoManager {
    INSTANCE(FooManager.getLogger(), BarManager.getDataBasePool());
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    private DaoManager (ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }

枚举的伟大之处在于它们与类相似。

于 2013-01-29T06:19:01.917 回答
0
public static enum DaoManager {
    INSTANCE;
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    public void init(ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }
于 2013-01-29T06:19:12.013 回答
0

我可以将 init 方法设为私有吗?

如果对象处于有效状态需要某种初始化逻辑。然后应该有一个工厂在向它请求对象时执行此操作。

有一个static init糟糕的设计。

顺便说一句,使用 Singleton 更像是一种用于测试的反模式。拥有全局状态会使对象难以测试。

您不应该限制构造函数,而是使用小“s”使对象单例。使用某种上下文对象来访问应用程序范围内的DaoManager.

applicationContext.getDaoManager()
于 2013-01-29T06:22:49.647 回答