带参数的Singleton Enum实现

时间:2013-01-29 06:15:05

标签: java design-patterns

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

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

我如何实现这一目标?让单身人士参与参与是一个好习惯吗?

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()方法,则很有可能失败。

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

3 个答案:

答案 0 :(得分:5)

考虑一下:

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

 }

关于枚举的好处是它们与类相似。

答案 1 :(得分: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;   
    }

 }

答案 2 :(得分:0)

  

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

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

拥有static init是糟糕的设计。

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

您不应该限制构造函数,而是使用小的's'创建对象 singleton 。使用某种上下文对象来访问DaoManager的应用程序范围的单个实例。

applicationContext.getDaoManager()