Я намагаюся знайти спосіб перебору значень переліку, використовуючи загальні засоби. Не знаю, як це зробити або якщо це можливо.
Наступний код ілюструє, що я хочу зробити. Зверніть увагу, що код T.values () не є дійсним у наступному коді.
public class Filter<T> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(T selectedOption) {
this.selectedOption = selectedOption;
for (T option : T.values()) { // INVALID CODE
availableOptions.add(option);
}
}
}
Ось як я б створив екземпляр об’єкта Filter:
Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
Перелік визначається наступним чином:
public enum TimePeriod {
ALL("All"),
FUTURE("Future"),
NEXT7DAYS("Next 7 Days"),
NEXT14DAYS("Next 14 Days"),
NEXT30DAYS("Next 30 Days"),
PAST("Past"),
LAST7DAYS("Last 7 Days"),
LAST14DAYS("Last 14 Days"),
LAST30DAYS("Last 30 Days");
private final String name;
private TimePeriod(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
Я усвідомлюю, що, можливо, не має сенсу копіювати значення перерахування в список, але я використовую бібліотеку, яка потребує списку значень як вхідні дані і не працюватиме з переліченнями.
РЕДАКТУВАТИ 02.02.2010:
Більшість запропонованих відповідей дуже схожі і пропонують зробити щось подібне:
class Filter<T extends Enum<T>> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(T selectedOption) {
Class<T> clazz = (Class<T>) selectedOption.getClass();
for (T option : clazz.getEnumConstants()) {
availableOptions.add(option);
}
}
}
Це буде чудово працювати, якщо я можу бути впевненим, що selectedOption має ненульове значення. На жаль, у моєму випадку використання це значення часто є нульовим, оскільки існує також публічний конструктор Filter () no-arg. Це означає, що я не можу зробити selectedOption.getClass (), не отримавши NPE. Цей клас фільтра керує списком доступних параметрів, який із них вибрано. Якщо нічого не вибрано, selectedOption має значення null.
Єдине, що я можу подумати, щоб вирішити це, - це насправді передати клас у конструкторі. Отож приблизно так:
class Filter<T extends Enum<T>> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(Class<T> clazz) {
this(clazz,null);
}
public Filter(Class<T> clazz, T selectedOption) {
this.selectedOption = selectedOption;
for (T option : clazz.getEnumConstants()) {
availableOptions.add(option);
}
}
}
Будь-які ідеї, як це зробити, не потребуючи додаткового параметра Class у конструкторах?
getClass
Код також не , якщо константа перерахування є анонімним підклас ( приклад ).getDeclaringClass
слід використовувати замість цього.