免责声明:如果这个问题太基本,请道歉。
我正在学习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());我的实现是否仍然遵循Singleton模式?或者这就是Enum类应该如何被引用的方式。
谢谢。
发布于 2017-03-12 13:36:04
我的实现是否仍然遵循Singleton模式?
是。您仍然有SerialNumberGen的一个实例。
除了第二种情况下的附加变量之外,两者之间没有区别。
您应该仔细考虑是否有一个可变的enum。Google Java库团队所支持的观点是:
静态一开始是危险的,但对于枚举则更糟糕。我们都认为枚举值是常量--甚至把它们称为“枚举常量”--如果它们的状态发生任何变化,或者不是线程安全的话,我们都会感到非常惊讶。
虽然枚举是创建线程安全创建单例的一种方便方法,但它们并不一定适合您在这里所做的工作。
对我来说,更大的问题是为什么你认为你需要一个单身的人?我建议你阅读并彻底考虑单身人士有什么不好的?。
这里没有什么真正需要单身人士的。您只需拥有一个SerialNumberGen实例,就可以将其注入任何需要它的地方。
发布于 2017-03-12 13:45:22
它仍然是单身人士。
但是请注意:更好的方法是将特定的行为封装到接口中,以便
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()因为这有助于进一步分离
在编写单元测试时,它也很有帮助。
https://stackoverflow.com/questions/42747967
复制相似问题