使用对象实例化作为枚举条目的值良好实践吗?

时间:2012-04-16 00:50:57

标签: java object enums instantiation

首先,如果这是现有问题的副本,请道歉。不确定如何说出我的问题,这可能就是为什么我还没有找到一个明确的答案。基本上,我想知道以下是否被认为是良好的做法,或者是否有更好的方法来做到这一点:

public enum ExampleEnum {
    ENTRY_1(new ExampleCodedValue("entry1", "comment1")),
    ENTRY_2(new ExampleCodedValue("entry2", "comment2")),
    ENTRY_3(new ExampleCodedValue("entry3", "comment3")),
    ENTRY_4(new ExampleCodedValue("entry4", "comment4"));

    private ExampleCodedValue codedValue;

    ExampleEnum(ExampleCodedValue codedValue) {
        this.codedValue = codedValue;
    }

    public ExampleCodedValue getCodedValue() {
        return codedValue;
    }
}

class ExampleCodedValue {

    private final String code;
    private final String comment;

    ExampleCodedValue(String code, String comment) {
        this.code = code;
        this.comment = comment;
    }
}

3 个答案:

答案 0 :(得分:11)

这是一种非常合理的方法,但是,你不能这样做:

public enum ExampleEnum {
    ENTRY_1("entry1", "comment1");

    private final String entry;
    private final String comment;

    private ExampleEnum(String entry, String comment) {
        ...
    }
}

答案 1 :(得分:1)

没关系,因为你的ExampleCodedValue是不可变的。

但是,如果它只是一个值容器,请问自己是否有充分的理由不将字段直接放入enum。一个很好的理由可能是您的值对象在概念上与枚举的其他字段分开。

枚举中包含的对象的另一个用例是使用多态来为每个对象提供不同的功能。例如:

PAINT_BRUSH(new PaintTool()),
ERASER(new EraserTool());

execute()PaintToolEraserTool左右的不同实现。

此时,您可能会问自己,我是否仍然使用enum在某个地方做出选择,或者我可以完全省略enum并使用{{1直接实例...另外,传统上,枚举不是围绕功能进行的。

答案 2 :(得分:-1)

首先,为什么你只是简单地将代码和注释属性添加到枚举本身?这似乎毫无意义。