Предположим, что у меня есть перечисление:
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
, допустимым злоупотреблением переменной счетчика и потенциально ошибочным в худшем случае (мысленное отражение, возможно).
Каким будет лучший способ реализовать методы getNext
и getPrevious
для типов перечислений в Java 7?
ПРИМЕЧАНИЕ: Я не намерен задавать этот вопрос субъективным. Моя просьба о "наилучшей" реализации - это сокращение, требующее, чтобы реализация была самой быстрой, чистой и удобной для обслуживания.