假设我有一个枚举:
enum E {
A, B, C;
}
如this answer所示由 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
方法的最佳方法是什么?
注意:我确实不希望这个问题是主观的。我对“最佳”实现的要求是要求最快、最干净和最可维护的实现的简写。
最佳答案
试试这个:
public enum A {
X, Y, Z;
private static final A[] vals = values();
public A next() {
return vals[(this.ordinal() + 1) % vals.length];
}
}
previous()
的实现留作练习,但请记住 in Java, the modulo a % b
can return a negative number .
编辑:按照建议,制作 values()
数组的私有(private)静态副本,以避免每次 next()
或 previous()< 时都复制数组
被调用。
关于java - 在枚举类型上实现 `next` 和 `previous` 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006239/