Singleton(传统vs Enum)

时间:2017-03-12 13:26:13

标签: java singleton enum-class

免责声明:如果这个问题太基础,请道歉。

我正在学习Singleton,并对其实现有一个快速的问题,这些差异纯粹是编码偏好还是我遗漏了什么?

Singleton Class

public enum SerialNumberGen {
INSTANCE;

private int count;

public synchronized int getNextSerial(){
    return count++;
}

示例实施

.println(SerialNumberGenerator.INSTANCE.getNextSerial());

我的实施

SerialNumberGen gen = SerialNumberGen.INSTANCE;
System.out.println(gen.getNextSerial());

我的实现是否仍然遵循Singleton模式?或者这是如何引用Enum类的。

感谢。

2 个答案:

答案 0 :(得分:1)

  

我的实现是否仍然遵循Singleton模式?

是。您仍然只有SerialNumberGen的一个实例。

除了第二种情况中的附加变量之外,两者之间没有区别。

你应该仔细考虑有一个可变的enumThe view epoused by Google's Java libraries team是:

  

静态开始时很危险,但枚举更糟糕。我们都认为枚举值是常量 - 甚至将它们称为“枚举常量” - 如果它们的任何状态发生变化或者不是线程安全的话,会非常惊讶。

虽然枚举是创建单线程创建线程安全的便捷方式,但它们并不一定非常适合您在此处所做的事情。

对我来说,这里更大的问题是为什么你认为你需要一个单身?我建议你阅读并彻底考虑What is so bad about singletons?

这里没有真正需要单身人士。您可以只使用SerialNumberGen的单个实例,并将其注入到需要它的任何位置。

答案 1 :(得分:0)

它仍然是一个单身人士。

但请注意:更好的方法是将特定行为封装到接口中,以便

public enum ServiceProvider implements Service {

这样你就可以了

Service service = ServiceProvider.INSTANCE
例如,

。从那里开始;我甚至创建了一个普通

class ServiceImpl implements Service {

然后再做

public enum ServiceProvider implements Service {
  INSTANCE;

   private final Service delegate = new ServiceImpl()

因为这有助于进一步分离

的职责
  1. 提供该服务界面
  2. 提供单身人士
  3. 在编写单元测试时也有帮助。