我正在尝试使用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()方法,则很有可能失败。
有人可以指导我如何做到这一点吗?
答案 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
是糟糕的设计。
您不应该限制构造函数,而是使用小的's'创建对象 singleton 。使用某种上下文对象来访问DaoManager
的应用程序范围的单个实例。
applicationContext.getDaoManager()