加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何改进这个单例?

发布时间:2020-12-15 05:10:39 所属栏目:Java 来源:网络整理
导读:我有一个将作为单身人士的班级. 该类将获取一个文件作为构造函数的一部分.之后,课程准备好了. 因此,目前我使用双重检查锁定惯用法并通过静态getInstance()获得单例的实例,即经典方式. 我的问题是,目前我经常这样做: MySingleton.getInstance(theFile); 只有
我有一个将作为单身人士的班级.
该类将获取一个文件作为构造函数的一部分.之后,课程准备好了.
因此,目前我使用双重检查锁定惯用法并通过静态getInstance()获得单例的实例,即经典方式.
我的问题是,目前我经常这样做:

MySingleton.getInstance(theFile);

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

解决方法

声明一个使用该文件处理初始化的init()方法.

简化getInstance()以返回实例,但如果尚未调用init(),则抛出IllegalStateException.

例如:

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(),竞争条件确实很少(如果有的话).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读