java – 如何改进这个单例?
发布时间:2020-12-15 05:10:39 所属栏目:Java 来源:网络整理
导读:我有一个将作为单身人士的班级. 该类将获取一个文件作为构造函数的一部分.之后,课程准备好了. 因此,目前我使用双重检查锁定惯用法并通过静态getInstance()获得单例的实例,即经典方式. 我的问题是,目前我经常这样做: MySingleton.getInstance(theFile); 只有
我有一个将作为单身人士的班级.
该类将获取一个文件作为构造函数的一部分.之后,课程准备好了. 因此,目前我使用双重检查锁定惯用法并通过静态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(),竞争条件确实很少(如果有的话). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |