0

免责声明:如果这个问题太基本,我们深表歉意。

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

单例类

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());

我的实现是否仍然遵循单例模式?或者这就是 Enum 类应该被引用的方式。

谢谢。

4

2 回答 2

1

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

是的。您仍然只有一个SerialNumberGen.

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


您应该仔细考虑拥有一个可变的enum. Google 的 Java 库团队提出的观点是:

静态状态一开始很危险,但对于枚举来说更糟。我们都将枚举值视为常量——甚至将它们称为“枚举常量”——如果它们的任何状态发生变化或不是线程安全的,我们都会感到非常惊讶。

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

对我来说,更大的问题是你为什么认为你需要一个单身人士?我建议您阅读并彻底考虑单身人士有什么不好?.

这里没有什么真正需要单例。您可以简单地拥有一个实例SerialNumberGen,您可以在任何需要它的地方注入它。

于 2017-03-12T13:36:04.900 回答
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. 提供单例

它还有助于编写单元测试。

于 2017-03-12T13:45:22.030 回答