我怎样才能改进这个单身人士?

时间:2013-04-02 06:45:16

标签: java oop design-patterns singleton

我有一个充当单身人士的班级 该类将获取一个文件作为构造函数的一部分。之后,课程准备好了。
因此,目前我使用双重检查锁定惯用法并通过static getInstance()获得单例的实例,即经典方式。
我的问题是,目前我经常这样做:

MySingleton.getInstance(theFile);

只有在第一次构造单例时才需要theFile。在那之后,即一旦构建了单身人士,我就不需要传递theFile 我该怎么做? 我想创建一个MySingleton.getInstance();,但这仍然不起作用,因为调用者必须第一次调用MySingleton.getInstance(theFile);来构建有效的类。 我怎样才能更好地设计这个?

7 个答案:

答案 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

由于我不知道你想要用这个课程究竟想要达到什么目标,我很遗憾无法提供解决方案。

除此之外:不要使用单身人士。

你以后会感谢我。 看起来很难,需要大量的阅读和试​​验,但正确的编码会让你感觉好多了。并会让你成为一个更好的程序员。