免责声明:如果这个问题太基础,请道歉。
我正在学习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类的。
感谢。
答案 0 :(得分:1)
我的实现是否仍然遵循Singleton模式?
是。您仍然只有SerialNumberGen
的一个实例。
除了第二种情况中的附加变量之外,两者之间没有区别。
你应该仔细考虑有一个可变的enum
。 The 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()
因为这有助于进一步分离
的职责在编写单元测试时也有帮助。