2009-09-15 17 views
7

मैं गलत हो सकता हूं लेकिन मैं Why can't enums be declared locally in a method? से अनुमान लगा रहा हूं कि चूंकि जावा में एक enum स्थानीय रूप से घोषित नहीं किया जा सकता है, इसलिए यह Enum प्रकार वापस करने के तरीके के लिए समस्याग्रस्त है? मैं घोषणा कर सकता हूं कि एक विधि को एक एनम (नीचे देखें) वापस करना चाहिए, लेकिन फिर कोई भी इस तरह की विधि को लागू करने के तरीके के बारे में कुछ भी नहीं लौटाएगा, या विधि के बाहर घोषित एनम के संदर्भ में कैसे होगा? मेरा पहला झुकाव इसके लिए जेनेरिकों का उपयोग करके जांच करना होगा, लेकिन अगर मैं एसओ समुदाय उनसे बचने में मेरी मदद कर सकता है तो मैं किसी भी मृतक से बचना चाहता हूं।जावा विधियां वापस प्रकार Enum कर सकते हैं?

private Enum resources() { 
    return null; 
} 
+0

आप 'एनम' प्रकार, या' एनम' मान वापस करना चाहते हैं? – jjnguy

+0

मुझे यकीन नहीं है कि प्रश्न का शीर्षक सबसे उपयुक्त है। आप वास्तव में क्या करना चाहते हैं? –

+0

भ्रम के लिए खेद है, और मैं निश्चित रूप से गलती कर रहा हूं कि मैं क्या करने की कोशिश कर रहा हूं (मेरी सोच देर से दोपहर में घबरा रही है) लेकिन मैंने सोचा कि मुझे एक सामान्य एनम * नहीं * एक सदस्य वापस करने की विधि हो सकती है एक एनम से। –

उत्तर

8

मुझे लगता है कि आप सही हैं, यह केवल null या Enum को कहीं और घोषित करने में सक्षम होने जा रहा है। लेकिन आपको संकलन समय पर "कुछ और" निर्दिष्ट करने की आवश्यकता नहीं है।

class EnumEnumerator<T extends Enum<T>> implements Iterable<T> { 
    private final Class<T> enumClass; 

    public EnumEnumerator(Class<T> enumClass) { 
     this.enumClass = enumClass; 
    } 

    public Iterator<T> iterator() { 
     T[] values = enumClass.getEnumConstants(); 
     return Arrays.asList(values).iterator(); 
    } 
    } 

बाद में, आप यह सामान्य निर्माता विशेषज्ञता और enum कक्षा में पास करके आह्वान आप में रुचि रखते हैं:

class EnumEnumeratorDemo { 
    enum Foo { 
     BAR, BAZ, QUX; 
     @Override public String toString() { 
      return name().toLowerCase(); 
     } 
    } 

    public static void main(String[] args) { 
     for (Foo f : new EnumEnumerator<Foo>(Foo.class)) { 
      System.out.println(f); 
     } 
    } 
} 

(जाहिर है यह एक काल्पनिक उदाहरण है और वास्तविक जीवन में आप सिर्फ चाहिए Foo.values ​​() पर कॉल करें, लेकिन आपको विचार मिलता है।)

+0

क्या आप कृपया इस कक्षा का उपयोग कैसे करें? – msysmilu

+0

किया-उम्मीद है कि यह मदद करता है। –

+1

पी। मानों की सरणी प्राप्त करने के लिए आप केवल 'मान = enumClass.getEnumConstants() ' – newacct

2

आप क्या करने की कोशिश कर रहे हैं? यह एक Enum वापस जाने के लिए एक तरीका है:

public class Test 
{ 
    public static void main(String args[]) 
    { 
     System.out.println(doit()); 
    } 

    public enum Foo { 
     BAR, 
     BAZ; 
    } 
    public static Enum doit() { 
     return Enum.valueOf(Foo.class,"BAR"); 
    } 
} 

लेकिन, मैं यह नहीं है कि आप क्या जा रहे हैं अनुमान लगा रहा हूँ?

+1

आप 'एनम ' चाहते हैं। –

+0

दरअसल, मुझे इस कोड में से कोई भी नहीं चाहिए; ऐसा करने के लिए एक अजीब चीज की तरह लगता है :) – davetron5000

1

हां, यह निश्चित रूप से संभव है। अपने स्वयं के जावा फ़ाइल, एक शीर्ष स्तर class के समान में

  • ;:

    private Enum getRetentionPolicy() { 
        return java.lang.annotation.RetentionPolicy.SOURCE; 
    } 
    

    अपने प्रश्न Enums घोषित करने के बारे में है, तो आप उन्हें घोषित कर सकता है

  • किसी अन्य वर्ग से संबंधित जावा फ़ाइल के भीतर, एक स्थिर आंतरिक class के समान;
1

नहीं पूरी तरह से यकीन है कि क्या अपने लक्ष्य है, लेकिन अगर आप एक generified विधि (यानी एक ही है कि अधिरोहित किया जाता था) वापस जाने के लिए चाहते थे आप निम्नलिखित की तरह कुछ हो सकता है:

public class MyEnumClass<T extends Enum<T>> { 
    public T resources() { 
     //do stuff here 
    } 
} 

नहीं पूरी तरह से यकीन है कि क्या आप वहां लाभ प्राप्त करेंगे, हालांकि यदि आप Enums और उनके तत्वों के विभिन्न सेटों के बारे में बात कर रहे हैं तो यह फायदेमंद हो सकता है।

यदि आप एनम क्लास (यानी इटरेटर के प्रति अभिशाप) के बारे में बात कर रहे हैं, जहां तक ​​मुझे पता है कि इसे जेनरेट नहीं किया गया है, इसलिए मुझे यकीन नहीं है कि जेनेरिक यहां बहुत मदद करेंगे।

1

आप इसके नाम से एक enum के मान को संदर्भित कर सकते हैं, उदा। Suit.SPADES।

आप मान() विधि का उपयोग कर सभी मानों पर पुन: प्रयास कर सकते हैं और मानों में से एक चुन सकते हैं।

3

सभी enums इंटरफ़ेस Enum को लागू करते हैं, ताकि आप निश्चित रूप से एक विधि लिख सकें जो इस तरह से एक enum लौटाता है। लेकिन यह विधि एक सिंगल एनम वैल्यू लौटाएगी। एक सामान्य मूल्य वापस करने का कोई तरीका नहीं है जिसमें पूरे enum शामिल है (कक्षा को वापस करने और प्रतिबिंब करने के अलावा)। हालांकि आप उन सभी enum मानों को वापस कर सकते हैं जो आप चाहते हैं कि कम या ज्यादा है।

enum Resources { ONE, TWO, THREE } 
enum MoreResources { UN, DEUX, TROIS } 
private Enum<?>[] resources() { 
    List<Enum<?>> resources = new ArrayList<Enum<?>>(); 
    resources.addAll(Arrays.asList(Resources.values()); 
    resources.addAll(Arrays.asList(MoreResources.values()); 
    return resources.toList(new Enum<?>[] {}); 
} 

इससे भी बेहतर दृष्टिकोण है कि अधिक typesafe ब्याज की enums के लिए एक आम इंटरफ़ेस को लागू है: इस दृष्टिकोण का

enum Resources { ONE, TWO, THREE } 
private Enum<?>[] resources() { 
    return Resources.values(); 
} 

एक लाभ यह है कि आप उदाहरण के लिए अधिक या कम मूल्यों लौट सकते है जैसे

आप अधिक कार्यक्षमता प्रदान करने के लिए इंटरफ़ेस में अतिरिक्त विधियां जोड़ सकते हैं।

3

जावा एन्म्स के रास्ते के पूरे बिंदु यह है कि वे टाइपएफ़ हैं - इसलिए आप एक वास्तविक (जो डबल-प्लस असहज होगा) वापस नहीं लौटाएंगे, इसके बजाय आप वास्तविक प्रकार को परिभाषित करते हैं (जैसे "सूट") जो एक वर्ग की तरह कार्य करता है। सूट में 4 "अंकित" उदाहरण हैं।

यदि आप "सूट" की अपेक्षा कर रहे थे, तो 7 की "रैंक" वापस करने के लिए क्या अच्छा होगा? यह सब कुछ तोड़ देगा!

यदि आप "एनम" या कुछ सामान्य मूल्य पारित करते हैं, तो आप इसके तरीकों को कॉल नहीं कर सके। TypeSafe Enums के बारे में सबसे अच्छी बात यह है कि आप केवल "सूट" प्राप्त कर सकते हैं और "Suit.getColor()" पर कॉल कर सकते हैं और पूरी तरह से उस सूट का रंग प्राप्त करने की उम्मीद कर सकते हैं।

assertTrue(SPADES.ranksHigherThan(HEARTS)); 

या, अधिक महत्वपूर्ण बात: तुम भी एक ranksHigherThan (सूट रों) जो पूरा हो सकता है हो सकता था

suit1.ranksHigherThan(suit2); 

(यह सोचते हैं कि वे दोनों में पारित किए गए और यदि आप नहीं जानते कि वे क्या कर रहे हैं)

टाइप सुरक्षा वास्तव में अद्भुत है (भले ही इसे पहले थोड़ा असहज महसूस हो), इसे गले लगाओ।

संबंधित मुद्दे