具有复合值的Java枚举

时间:2016-02-15 08:42:14

标签: java enums

使用复合值进行枚举是否合适:

private enum SomeEnum {
    A, B, A_AND_B, NEITHER;
}

我觉得它应该具有类似XOR的逻辑,应该只包含基本单位值。如果以某种方式需要使用A&amp; B在一起,应该在List<SomeEnum>。我的想法是正确的,还是有缺陷的。你能告诉我一些这方面的细节吗?

2 个答案:

答案 0 :(得分:1)

您询问了有关使用某种方法或其他方法更合适的原因的详细信息。这取决于你打算用有问题的枚举做什么,以及它是否可能改变。

如果有可能有一天除了AB之外还有其他选择,那么使用Set显然更“合适”(EnumSet是最有效的实现,因为其他人在这里已经指出),因为否则你可能会创建一个未来的bug。

否则,对于您引用的具体案例,适用的原则可能是YAGNI。这是最简单的方法,并在你有时间的时候改进它。

更一般地说,代码的复杂性和可读性存在问题。如果只有4种可能性,我认为使用Set不会使代码更具可读性,并且它使它更简单(特别是如果值必须传递到数据库和从数据库传递)。

但是,如果价值不仅仅是AB,那么Set方法显然更优越。 Set方法的优点是代码的复杂性不会随着可能值的数量而增加。另一方面,拼写出枚举中的所有组合变得越来越多,每个附加值(组合数量的增加的因子顺序)都是爆炸性的混乱,随着遗漏错误的风险增加。如果你想将数据与每个枚举值相关联,通过构造函数传入,它就会变得更加混乱。

答案 1 :(得分:0)

使用Set表示元素组合。你是对的,枚举应该只包含“原子”。

List可能不合适,因为您通常不关心这些元素的排序。

另请注意,Java为枚举提供了EnumSet作为内存高效的Set实现。