2009-10-26 7 views
49

बढ़ाता है मुझे कक्षा के लिए कक्षा वस्तु मिली है (मेरे पास Class<? extends Enum> है) और मुझे इस enum द्वारा प्रतिनिधित्व किए गए समेकित मानों की एक सूची प्राप्त करने की आवश्यकता है। values स्थैतिक फ़ंक्शन की मुझे आवश्यकता है, लेकिन मुझे यकीन नहीं है कि क्लास ऑब्जेक्ट से इसका उपयोग कैसे किया जाए।जावा एनम्स: कक्षा से समेकित मूल्यों की सूची <? Enum>

+0

इसके स्थिर: एक ओर जहां यह संकलन नहीं होगा

String.class.getEnumConstants(); 

: उदाहरण के लिए, नीचे दिए गए कोड वैध है और null देता है। – IAdapter

+0

'कक्षा' एक प्रतिबिंब वस्तु है (यह पैकेज को पूर्ववत करता है)। –

उत्तर

10

Class#getEnumConstants() बुला के रूप में प्रतिबिंब सरल है का उपयोग करते हुए:

List<Enum> enum2list(Class<? extends Enum> cls) { 
    return Arrays.asList(cls.getEnumConstants()); 
} 
16

आप मूल्य आप की जरूरत का नाम जानते हैं:

 Class<? extends Enum> klass = ... 
    Enum<?> x = Enum.valueOf(klass, "NAME"); 

आप नहीं करते हैं, आप उनमें से एक सरणी प्राप्त कर सकते हैं (जैसा कि टॉम पहले मिला था):

 klass.getEnumConstants(); 
3

मैं देखना है कि EnumSet#allOf() उल्लेख नहीं है आश्चर्य हो रहा:

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

एक enum निर्दिष्ट तत्व प्रकार में सभी तत्त्व युक्त सेट बनाता है।

निम्नलिखित enum पर विचार करें:

enum MyEnum { 
    TEST1, TEST2 
} 

सीधे शब्दों में इस तरह विधि कॉल:

Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class); 
बेशक

, यह एक Set, नहीं एक List देता है, लेकिन यह पर्याप्त होना चाहिए कई (सबसे?) मामलों का उपयोग करें।

या, अगर आपके पास एक अज्ञात enum:

Class<? extends Enum> enumClass = MyEnum.class; 
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass); 

Class#getEnumConstants() की तुलना में इस विधि का लाभ यह है कि इतना है कि यह यह करने के लिए एक enum के अलावा और कुछ पारित करने के लिए संभव नहीं है यह लिखा गया है । प्रतिबिंब -

EnumSet.allOf(String.class); // won't compile 
संबंधित मुद्दे