Как написать генератор для цикла для Java Enum?
Есть ли способ написать общий цикл для итерации по произвольному Enum?
Например:
public static void putItemsInListBox(Enum enum, ListBox listbox){
for(Enum e : enum.values(){
listBox.addItem(e.toString(), String.valueOf(e.ordinal());
}
}
Вы не можете сделать это, потому что класс Enum не имеет метода, называемого значениями(), как и реализованные классы Enum. Вышеупомянутый для цикла отлично работает для класса, который определяется как перечисление.
Ответы
Ответ 1
Он работает точно так же, как если бы передавался Class
:
public static <E extends Enum<?>> void iterateOverEnumsByInstance(E e)
{
iterateOverEnumsByClass(e.getClass());
}
public static <E extends Enum<?>> void iterateOverEnumsByClass(Class<E> c)
{
for (E o: c.getEnumConstants()) {
System.out.println(o + " " + o.ordinal());
}
}
Использование:
enum ABC { A, B, C }
...
iterateOverEnumsByClass(ABC.class);
iterateOverEnumsByInstance(ABC.A);
Ответ 2
Это дешево, но должно работать (по крайней мере, согласно моему тестированию):
public static <T extends Enum<T>> void putItemsInListBox(Class<T> cls, ListBox listbox) {
for (T item : EnumSet.allOf(cls))
listbox.addItem(item.toString(), String.valueOf(item.ordinal()));
}
Это работает, потому что EnumSet
имеет специальный магический доступ к непубличным членам Enum
, который позволяет ему перечислять значения перечисления, несмотря на отсутствие метода values
.