假设我有一个枚举:
enum E {
A, B, C;
}
如图所示这个答案 by lucasmo,枚举值按照初始化的顺序存储在静态数组中,稍后您可以使用以下命令检索该数组(的克隆)E.values()
.
现在假设我想实现E#getNext
and 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
循环,对计数器变量的滥用是有争议的,最坏的情况下可能是错误的(可能是思考反射)。
最好的实施方式是什么getNext
and getPrevious
Java 7 中枚举类型的方法?
NOTE: I do not打算这个问题是主观的。我对“最佳”实现的要求是要求最快、最干净、最可维护的实现的简写。
尝试这个:
public enum A {
X, Y, Z;
private static final A[] vals = values();
public A next() {
return vals[(this.ordinal() + 1) % vals.length];
}
}
实施previous()
留作练习,但请记住在 Java 中,模数a % b可以返回负数.
编辑:按照建议,制作一个私有静态副本values()
数组以避免每次都复制数组next()
or previous()
叫做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)