首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Singleton (传统对Enum)

Singleton (传统对Enum)
EN

Stack Overflow用户
提问于 2017-03-12 13:26:13
回答 2查看 903关注 0票数 0

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

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

单例类

代码语言:javascript
运行
复制
public enum SerialNumberGen {
INSTANCE;

private int count;

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

示例实现

代码语言:javascript
运行
复制
.println(SerialNumberGenerator.INSTANCE.getNextSerial());

我的实现

代码语言:javascript
运行
复制
SerialNumberGen gen = SerialNumberGen.INSTANCE;
System.out.println(gen.getNextSerial());

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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-03-12 13:36:04

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

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

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

您应该仔细考虑是否有一个可变的enumGoogle Java库团队所支持的观点是:

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

虽然枚举是创建线程安全创建单例的一种方便方法,但它们并不一定适合您在这里所做的工作。

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

这里没有什么真正需要单身人士的。您只需拥有一个SerialNumberGen实例,就可以将其注入任何需要它的地方。

票数 1
EN

Stack Overflow用户

发布于 2017-03-12 13:45:22

它仍然是单身人士。

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

代码语言:javascript
运行
复制
public enum ServiceProvider implements Service {

这样你就可以

代码语言:javascript
运行
复制
Service service = ServiceProvider.INSTANCE

例如。之后,我甚至创建了一个普通的

代码语言:javascript
运行
复制
class ServiceImpl implements Service {

然后再做

代码语言:javascript
运行
复制
public enum ServiceProvider implements Service {
  INSTANCE;

   private final Service delegate = new ServiceImpl()

因为这有助于进一步分离

  1. 提供该服务接口
  2. 提供单身人士

在编写单元测试时,它也很有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42747967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档