gpt4 book ai didi

java - 我该如何改进这个单例?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:29:52 26 4
gpt4 key购买 nike

我有一个类将充当单例。
此类将获得一个文件作为构造函数的一部分。之后类(class)就可以开始了。
所以目前我使用双重检查锁定惯用语并通过 static getInstance() 获取单例实例,即经典方式。
我的问题是目前我经常这样做:

MySingleton.getInstance(theFile);

theFile只在第一次构造单例时需要。之后,即一旦构建了单例,我就不需要传入 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(),竞争条件确实很少(如果有的话)。

关于java - 我该如何改进这个单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15757798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com