如何在枚举类型上实现`next`和`previous`的最佳方法是什么?

16 浏览
0 Comments

如何在枚举类型上实现`next`和`previous`的最佳方法是什么?

假设我有一个枚举:

enum E {
    A, B, C;
}

lucasmo所示,枚举值以初始化的顺序存储在静态数组中,你可以通过E.values()来获取(克隆的)数组。

现在假设我想实现E#getNextE#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中,最佳的实现getNextgetPrevious方法的方式是什么?


注意:我并不打算让这个问题是主观的。我对“最佳”实现的请求是为了寻求最快、最清晰和最易维护的实现方式。

0