假设我有一个枚举:
enum E {
A, B, C;
}
如 lucasmo 在 这个答案 中所示,枚举值按初始化顺序存储在静态数组中,您稍后可以使用 E.values()
检索(克隆)该数组。
现在假设我要实现 E#getNext
和 E#getPrevious
使得以下所有表达式的计算结果为 true
:
E.A.getNext() == E.B
E.B.getNext() == E.C
E.C.getNext() == E.A
E.A.getPrevious() == E.C
E.B.getPrevious() == E.A
E.C.getPrevious() == E.B
我当前对 getNext
的实现如下:
public E getNext() {
E[] e = E.values();
int i = 0;
for (; e[i] != this; i++)
;
i++;
i %= e.length;
return e[i];
}
以及 getPrevious
的类似方法。
然而,这段代码充其量看起来很麻烦(例如,“空” for
循环,计数器变量的可争论的滥用,并且在最坏的情况下可能是错误的(思考反射,可能)。
在 Java 7 中实现 getNext
和 getPrevious
枚举类型方法的最佳方法是什么?
注意: 我 不希望 这个问题是主观的。我对“最佳”实现的要求是要求实现速度最快、最干净且最易于维护的简写。
原文由 wchargin 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试这个:
previous()
的实现留作练习,但请记住, 在 Java 中,取模a % b
可以返回负数。编辑:按照建议,制作
values()
数组的私有静态副本,以避免每次调用next()
或previous()
数组复制