我有一个充当单身人士的班级
该类将获取一个文件作为构造函数的一部分。之后,课程准备好了。
因此,目前我使用双重检查锁定惯用法并通过static getInstance()
获得单例的实例,即经典方式。
我的问题是,目前我经常这样做:
MySingleton.getInstance(theFile);
只有在第一次构造单例时才需要theFile
。在那之后,即一旦构建了单身人士,我就不需要传递theFile
我该怎么做?
我想创建一个MySingleton.getInstance();
,但这仍然不起作用,因为调用者必须第一次调用MySingleton.getInstance(theFile);
来构建有效的类。
我怎样才能更好地设计这个?
答案 0 :(得分:9)
声明一个使用该文件处理初始化的init()
方法。
简化getInstance()
以返回实例,但如果尚未调用IllegalStateException
则抛出init()
。
例如:
public class MySingleton {
private MySingleton INSTANCE;
// private constructor is best practice for a singleton
private MySingleton(File theFile) {
// initialize class using "theFile"
}
public static void init(File theFile) {
// if init previously called, throw IllegalStateException
if (INSTANCE != null)
throw new IllegalStateException();
// initialize singleton
INSTANCE = new MySingleton(theFile);
}
public static MySingleton getInstance() {
// if init hasn't been called yet, throw IllegalStateException
if (INSTANCE == null)
throw new IllegalStateException();
return INSTANCE;
}
// rest of class
}
请注意,虽然这不是线程安全的,但只要在服务器启动过程中尽早调用init()
,竞争条件确实很少(如果有的话)。
答案 1 :(得分:3)
在典型的依赖注入环境中,您的文件名将是与此单例类对应的单例bean的属性,其范围为singleton。然后你只需要在任何需要它的类中注入这个bean。
如果你的程序没有DI容器,那么这个文件名应该是作为JVM参数获得的应用程序级属性/通过某些属性文件或最坏情况,该单例类中的常量。客户端不应该担心这个单例类使用的文件。
答案 2 :(得分:1)
可能是您可以提供初始化单例的方法。您可以在应用程序启动时或在适当的位置定义一个名为initialize()的静态方法,该方法接收文件并创建单个对象。之后,你可以使用getInstance()。
答案 3 :(得分:0)
你可以简单地使用一个没有文件参数的getInstance()方法。
如果在另一个之前调用它会抛出异常,但这没关系,因为在任何情况下,如果你已经确定之前已经创建了单例,那么你只能避免传递文件。
答案 4 :(得分:0)
init()
方法+例外
Singleton::getInstance().load(myFile)
确保在启动时完成此操作。
答案 5 :(得分:0)
首先是singletone with parameter is not a singletone的替代方法。
要解决这个问题,你有两个选择,第一个是在链接上面描述,第二个是从内部获取资源。
该文件通常与路径相关联,您可以从应用程序启动期间传递/设置的属性存储类型访问该路径。
可能实施此类机制:
public enum MySingleton {
INSTANCE;
private final File theFiel;
private MySingleton() {
this.theFile = initialize(MySystemProperties.getValue(MySystemProperties.MY_SINGLETONE_PATH);
}
private File initialize(String path) {
reutrn new File(path); //
}
}
答案 6 :(得分:0)
优化它的唯一方法是不使用单例模式。
严重。你在脚下射击自己。
每当你开始将未使用的值传递给方法时,应该会有真的响亮的警报响起,警告你在丹麦的状态下,某些东西在建筑上会腐烂。显然你可以选择忽略那些警钟(而且很可能也是这个答案),但它不会让你的代码变得更少。我知道,我在这里是一个吝啬鬼。 但事实很简单,使用单身人士可以将你的程序变成大堆热气腾腾的意大利面。
There are | huge amounts | of posts | on why | singletons suck | more ass | than a | leech on | a donkey
由于我不知道你想要用这个课程究竟想要达到什么目标,我很遗憾无法提供解决方案。
除此之外:不要使用单身人士。
你以后会感谢我。 看起来很难,需要大量的阅读和试验,但正确的编码会让你感觉好多了。并会让你成为一个更好的程序员。