是否使用对象实例化作为枚举项的值良好实践?
问题描述:
首先,如果这是现有问题的重复,请致歉。我不确定如何说出我的问题,这可能是为什么我还没有找到明确的答案。从本质上讲,我想知道如果下面被认为是很好的做法,或者有更好的方法来做到这一点:是否使用对象实例化作为枚举项的值良好实践?
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;
}
}
答
然而,这是一个完全合理的方式做到这一点,不能你这样做:
public enum ExampleEnum {
ENTRY_1("entry1", "comment1");
private final String entry;
private final String comment;
private ExampleEnum(String entry, String comment) {
...
}
}
答
首先,为什么不能只需添加的代码和注释属性的枚举本身?这似乎完全没有意义。
答
这是很好的,因为你的ExampleCodedValue
是不可改变的。
但是,如果它只是一个价值容器,问问自己是否有充分的理由不把这些字段直接放入enum
。一个很好的理由可能是你的价值对象在概念上与枚举的其他领域分开。
枚举中包含的对象的另一个用例是使用多态性为每个对象提供不同的功能。例如:
PAINT_BRUSH(new PaintTool()),
ERASER(new EraserTool());
随着PaintTool
和EraserTool
的左右不同的实现。
在这一点上,你可能会问自己,虽然,我还受使用enum
做出选择的地方,我也可以省略enum
干脆而直接使用Tool
实例......此外,传统上,枚举唐不围绕功能旋转。
+1吻原则。顺便说一句,我通常创建带有字段的枚举(像这样)。他们可以非常方便。 – Bohemian 2012-04-16 01:12:22
主要原因是这个枚举和其他类似的枚举使用了'ExampleCodedValue'的通用数据类型。例如,你可能有两个枚举,'Settings'和'Attributes'。每个由代码和评论组成。这是对我的实际用例的过分简化,但是这两个枚举在封装方面是不同的。我也考虑过使用@Jeffery的例子,并且有一个返回'ExampleCodedValue'类型的访问器方法。也许这是一个更好的方法来做到这一点? – speedRS 2012-04-16 01:49:04
@speedRS我只是想知道为什么你会为了创建一个没有提供额外功能的对象而烦恼。但是由于您的用例需要具有该特定对象,因此您的原始示例没有任何问题。 – Jeffrey 2012-04-16 01:50:22