众所周知,实施单身人士的最佳方式之一就是使用Enum
,Josh Bloch受欢迎。
他说:
这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多个实例化的铁定保证,即使面对复杂的序列化或反射攻击。虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。
这仍然适用于多元素Enum
吗?不知道每个元素只被实例化一次吗?
感知的好处是有几个相似但不同的单例枚举,例如:每个元素注入不同的配置。
示例:
public enum Beatles {
george("George"),
john("John"),
paul("Paul"),
ringo("Ringo"),
;
private Beatles(final String name) {
this.name = name;
}
private final String name;
public String getName() {
return name;
}
}
答案 0 :(得分:2)
您可以扩展单元素枚举范例以支持类似但不同的"单一标记使用标记界面:
public interface MySingletonInterface {
void doFoo(Bar bar);
}
然后你的枚举可以实现界面:
public enum FirstSingletonEnum implements MySingleTonInterface {
...
@Override
public void doFoo(Bar bar) {
... //do something with bar
}
}
public enum SecondSingletonEnum implements MySingleTonInterface {
...
@Override
public void doFoo(Bar bar) {
... //do something slightly different with Bar
}
}
我觉得这是一种更干净的方法,可以将所有实现都限制在单个枚举中。
就枚举中的逻辑而言,我会非常仔细地对待它。一般来说,我认为只要逻辑与每个枚举实例所代表的内容紧密耦合,以及枚举作为一个整体所代表的内容,枚举逻辑就可以了。如果您正在做其他服务或与外部实体(如数据库)交谈,那么枚举可能不是正确的选择。
答案 1 :(得分:1)
enum A {INSTANCE};
内部相当于
class A {
public static final A INSTANCE = new A();
}
所以我们可以称之为Singleton。但如果它有更多的字段,则不能称为Singleton,因为Singleton模式只需要一个字段。我认为这就是Josua Bloch的意思