多元素枚举仍然是单身人士?

时间:2015-07-02 18:26:35

标签: java enums singleton

众所周知,实施单身人士的最佳方式之一就是使用EnumJosh 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;
    }
}

2 个答案:

答案 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的意思