मैं जेनरिक का उपयोग करते समय एक एनम के मूल्यों के माध्यम से पुनरावृति का रास्ता खोजने की कोशिश कर रहा हूं। यह सुनिश्चित करने के लिए नहीं कि यह कैसे करना है या यदि यह संभव है।
निम्न कोड दिखाता है कि मैं क्या करना चाहता हूं। ध्यान दें कि निम्नलिखित कोड में 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;
}
}
मुझे लगता है कि किसी सूची में एनम के मूल्यों को कॉपी करने का कोई मतलब नहीं हो सकता है, लेकिन मैं एक पुस्तकालय का उपयोग कर रहा हूं जिसे इनपुट के रूप में मूल्यों की एक सूची की आवश्यकता है और यह एनम के साथ काम नहीं करेगा।
EDIT 2/5/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);
}
}
}
यह बहुत अच्छा काम करेगा अगर मैं यह सुनिश्चित कर सकूँ कि चयनित ऑप्शन का गैर-शून्य मान है। दुर्भाग्य से, मेरे उपयोग के मामले में, यह मान अक्सर शून्य है, क्योंकि सार्वजनिक फ़िल्टर () नो-आर्ग कंस्ट्रक्टर भी है। इसका मतलब है कि मैं NPE प्राप्त किए बिना एक चयनितOget.getClass () नहीं कर सकता। यह फ़िल्टर वर्ग उपलब्ध विकल्पों की एक सूची का प्रबंधन करता है जो विकल्पों में से चुना गया है। जब कुछ भी नहीं चुना जाता है, तो चयनित किया जाना अशक्त है।
केवल एक चीज जो मैं इसे हल करने के लिए सोच सकता हूं, वह वास्तव में निर्माणकर्ता में एक कक्षा में पास करना है। तो कुछ इस तरह:
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
इसके बजाय उपयोग किया जाना चाहिए।