繁体   English   中英

具有参数的Singleton Enum实现

[英]Singleton Enum implementation with parameters

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

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

我该如何实现? 将Singletons与参数一起使用是一种好习惯吗?

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

有人可以指导我该怎么做吗?

考虑:

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

 }

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

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

 }

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

是否需要某种初始化逻辑,才能使对象处于有效状态。 然后应该有一个工厂,当有一个对象被请求时,工厂就会这样做。

具有static init是不好的设计。

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

你不应该限制的构造函数,但做一个小的'对象 使用某种上下文对象可以访问DaoManager的应用程序范围内的单个实例。

applicationContext.getDaoManager()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM