すべての列挙型には。がordinal
あるため、基本クラスを使用しようとしている列挙型だけでなく、すべての列挙型の「次の」値を取得することは有効です。これは、次のヘルパーメソッドを記述できることを意味します。
public static <T extends Enum<T>> T getNext(T current) {
Class<T> enumType = current.getDeclaringClass();
T[] enumConstants = enumType.getEnumConstants(); // Similar to e.g. Day.values()
int currentOrdinal = current.ordinal();
int nextOrdinal = currentOrdinal + 1;
if (nextOrdinal == enumConstants.length) { // Handle wrapping around to the beginning of the enum values
nextOrdinal = 0;
}
return enumConstants[nextOrdinal];
}
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}
public static void main(String... args) {
System.out.println(getNext(Day.MONDAY)); // TUESDAY
System.out.println(getNext(Day.SUNDAY)); // MONDAY
System.out.println(getNext(Month.JANUARY)); // FEBRUARY
System.out.println(getNext(Month.DECEMBER)); // JANUARY
}
すべての列挙型に対してこれを実行できないようにしたい場合(厳密に順序付けされていない列挙型では意味がない可能性があります)、次のようにマーカーインターフェイスを適用できます。
public interface Ordered {}
public enum Day implements Ordered {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static <T extends Enum<T> & Ordered> T getNext(T current) {
...
}
列挙型を反射的に操作する方法の詳細については、こちらをご覧ください。