제네릭을 사용하는 동안 열거 형 값을 반복하는 방법을 찾으려고합니다. 이 작업을 수행하는 방법 또는 가능한지 확실하지 않습니다.
다음 코드는 내가 원하는 것을 보여줍니다. 코드 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<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;
}
}
열거 형의 값을 목록에 복사하는 것이 이치에 맞지 않을 수도 있지만 값 목록이 입력으로 필요하고 열거 형으로 작동하지 않는 라이브러리를 사용하고 있습니다.
2010 년 2 월 5 일 수정 :
제안 된 대부분의 답변은 매우 유사하며 다음과 같이 제안합니다.
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에 null이 아닌 값이 있는지 확인할 수 있다면 이것은 잘 작동합니다. 불행히도 내 사용 사례에서는 public Filter () no-arg 생성자 가 있기 때문에이 값은 종종 null 입니다. 이것은 NPE없이 selectedOption.getClass ()를 수행 할 수 없음을 의미합니다. 이 필터 클래스는 어떤 옵션이 선택되었는지 사용 가능한 옵션 목록을 관리합니다. 아무것도 선택하지 않으면 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);
}
}
}
생성자에 추가 클래스 매개 변수가 필요하지 않고이를 수행하는 방법에 대한 아이디어가 있습니까?
getClass
enum 정수 익명 서브 클래스 (코드 인 경우는 실패 예 ).getDeclaringClass
대신 사용해야합니다.