gpt4 book ai didi

java - 通过配置文件初始化 "singleton"是否合适?

转载 作者:行者123 更新时间:2023-12-01 18:27:25 25 4
gpt4 key购买 nike

通过配置文件初始化单例是否合适?

我注意到单例的构造函数不应该有任何参数,原因是如果你需要使用参数来配置你的对象,可能不应该是单例。看起来这句话很有名,但确实有几个例子比较特殊:

例如:我们设计了一个简单的分布式系统来处理大量用户的查询:

  • 只有一台中央服务器
  • n个子服务器,每个子服务器都连接到中央服务器
  • 子服务器之间没有连接

显然,我们可以将“中央服务器”设计为单例,具体如下:

  • 枚举服务器类型;
  • 抽象类Server;
  • 类 CentralServer 继承自 Server;(CentralServer 是单例)
  • 子服务器类继承自服务器;
  • 类查询;
  • …………

但是中央服务器需要一些配置,例如:

  • 服务器名称
  • 描述
  • 端口号-ip地址映射
  • 其子服务器列表
  • BlockingQueue 的大小
  • …………

如何通过这些属性初始化中央服务器?
我当前的解决方案:

  • 使用配置文件来完成这部分工作。
  • 我定义了另一个名为 Configuration 的类。

所以当前中央服务器的构造函数是这样的:

class CentralServer extends Server implements Runnable, ....... {
....
....
private static CentralServer _instance;
private CentralServer () {
super();
....
serverName = Configuration.getCentralServerName();
description = Configuration.getCentralServerDescription();
Configuration.initCentralServerPortNumIpMap(portNumIpMap);
Configuration.initCentralServerSubServersList(subServersList);
sizeBlockingQueue = Configuration.initCentralServerBlockingQueueSize();
....
}

public CentralServer getInstance() {
if (_instance == null) {
_instance = new CentralServer();
}
return _instance;
}
....
....
}

Configuration类,将读取并分析配置文件,以获取配置信息。

<小时/>我的问题:

  • 这样初始化单例是否合适,如果不合适,请给出更合适的方法

  • 我还需要配置所有子服务器,所以看起来配置类太重了,我应该将 Big Configuration 类拆分成两个子类?类 CentralConfiguration 和类子配置?

最佳答案

不幸的是,您对 Singelton 的实现是错误的!很简单,因为它不是线程安全的。

public CentralServer getInstance() {
if (_instance == null) { // race condition possible here
_instance = new CentralServer();
}
return _instance;
}

两个线程可能会进入此临界区并将 _instance==null 计算为 true,并且将创建两个不同的实例。您可以简单地静态实例化您的实例。

private final static CentralServer INSTANCE = new CentralServer();

public static CentralServer getInstance() {
return INSTANCE;
}

但是,实现单例的最佳方法是使用枚举

public enum CentralServer { // the best way to implement singletons, due to the author of Effective Java  
INSTANCE;

private CentralServer() {
}
}

这为您提供免费序列化。然而,我认为你根本不需要单例,单例通常是反模式。 Check this out .

在您的代码中,CentralServerConfiguration 具有高度依赖性,我认为这不是一件好事,您应该将 Configuration 视为依赖项

class CentralServer{
private final Configuration serverConf;

private CentralServer(Configuration serverConf){ // inject configuration
this.serverConf = serverConf;
}
public static CentralServer createCentralServer(Configuration serverConf){ // static factory perhaps
return new CentralServer(serverConf);
}
}

这将为您提供更灵活的更改或模拟配置。我认为工厂模式在这里更合适。

关于java - 通过配置文件初始化 "singleton"是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587264/

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