2017-09-10 36 views
6

मान लीजिए आप 3 मूल्यों के साथ एक enum है:क्या यह लागू करने का कोई तरीका है कि आप जावा में एक enum के सभी परिभाषित मानों पर स्विच कर रहे हैं?

enum Colors { RED, GREEN, BLUE } 

आप कुछ विधि में इसके बारे में सभी मूल्यों पर स्विच, यह सोच कर आप सभी मामलों संभाला है:

switch (colors) { 
    case RED: ... 
    case GREEN: ... 
    case BLUE: ... 
} 

फिर बाद में, आप एक जोड़ने enum करने के लिए नए मूल्य:

enum Colors { RED, GREEN, BLUE, YELLOW } 

और सब कुछ अभी भी ठीक संकलित है, सिवाय इसके कि आप चुपचाप विधि में YELLOW के लिए एक मामला नहीं हुआ है। क्या इस तरह के परिदृश्य में संकलन-समय त्रुटि को बढ़ाने का कोई तरीका है?


संपादित करें: समझ में नहीं आता है क्यों इस Can I add and remove elements of enumeration at runtime in Java के शिकार के रूप में चिह्नित किया गया था। चूंकि उत्तर "नहीं" था, इसका मतलब है कि संकलन-समय पर एक enum के सभी मूल्यों को जानना संभव होना चाहिए, और इसलिए मैं जो भी मांग रहा हूं उसे संकलक/कुछ कोड विश्लेषण उपकरण को लागू करने के लिए संभव होना चाहिए, दाएं ?

+0

'डिफ़ॉल्ट: नया असमर्थितऑपरेशन अपवाद(); '? – tkausl

+5

@ कॉलंडर निश्चित रूप से उस प्रश्न का डुप्लिकेट नहीं है। –

+0

@ कोलोन्डर इसे डुप्ली के रूप में चिह्नित करें, सुंदर कृपया? :) –

उत्तर

6

यह संकलक पर निर्भर करता है। ग्रहण आईडीई अंतर्निर्मित संकलक उस मामले में एक त्रुटि को बढ़ाने के लिए कॉन्फ़िगर किया जा सकता है।

विंडोज/प्राथमिकताएं जावा कंपाइलर त्रुटियां/चेतावनियां "अपूर्ण" स्विच 'enum पर "मामलों को" त्रुटि "पर सेट किया जा सकता है।

संपादित करें:

यहां तक ​​कि एक उप विकल्प "संकेत 'डिफ़ॉल्ट' मामले से मौजूद है, भले ही" है।

+0

दिलचस्प। मुझे नहीं पता था कि ग्रहण में यह सुविधा थी। क्या होता है यदि स्विच में एक डिफ़ॉल्ट केस है (जो रनटाइम अपवाद फेंक देगा)? क्या इसे उस मामले में पूरा माना जाता है (क्षमा करें, यहां जल्दी परीक्षण करने के लिए कोई ग्रहण नहीं है)? –

+1

@JB बस मेरे उत्तर में जानकारी जोड़ा –

+0

धन्यवाद @ राल्फ –

1

मुझे नहीं लगता कि ऐसा करने का एक डिफ़ॉल्ट तरीका है। कुछ बाहरी उपकरणों के साथ यह संभव हो सकता है।

स्विच स्टेटमेंट में डिफ़ॉल्ट प्रदान नहीं करना और अपवाद उठाना क्यों नहीं। इसके अलावा, यदि आप अपनी परियोजना को संकलित करते हैं और आपके सभी यूनिट परीक्षण ठीक हैं, तो इस परिदृश्य का परीक्षण करने के लिए आपके पास पर्याप्त यूनिट परीक्षण होना चाहिए, इसका मतलब यह होगा कि आप पर्याप्त गहराई से परीक्षण नहीं कर रहे हैं।

+0

यह संभवतः एक _lot__ काम है जिसे वास्तव में कंपाइलर को छोड़ा जाना चाहिए। (बेशक, जावा में आप नहीं कर सकते, जो शर्म की बात है।) इस तरह के चेक के लिए परीक्षणों का उपयोग करने के बारे में आपका तर्क बहुत व्यापक अर्थ में लागू किया जा सकता है; तो हमारे पास प्रकार और सामान क्यों हैं और कोई संकलन-समय जांच क्यों है? –

8

संख्या लेकिन enums कक्षाएं हैं। तो अगर आप बहुरूपता का उपयोग कर सकते हैं:, अब

enum Color { 
    RED { 
     @Override 
     public void foo() { ... } 
    }, 
    GREEN { 
     @Override 
     public void foo() { ... } 
    }, 
    BLUE { 
     @Override 
     public void foo() { ... } 
    }; 

    public abstract void foo(); 
} 

यदि आप एक रंग जोड़ने, संकलक आप जोड़ना यह यह यह सार विधि पर हावी नहीं होता नहीं दूँगा।

और

switch (color) { 
    case RED: ... 
    case GREEN: ... 
    case BLUE: ... 
} 

के बजाय आप सिर्फ इतना है कि Kotlin, अगर Kotlin एक विकल्प है कि आप क्या चाहते करने की अनुमति देता का उपयोग कर सकते

color.foo(); 

नोट।

यह भी ध्यान दें कि नीला रंग एक रंग नहीं है। तो enum रंग रंग नहीं होना चाहिए, रंग नहीं।

+0

यहां कोटलिन का जिक्र करने के लिए अंगूठे! –

+0

बिल्कुल, पॉलीमोर्फिज्म के साथ सशर्त को बदलना यह हल करने के लिए ओओपी तरीका है। –

+0

यह वास्तव में एक बहुत ही मजेदार जवाब है। मुझे यकीन नहीं है कि मैं अपने 'रंगों' enum में तर्क डालना चाहता हूं, हाहा :) यह अनिवार्य रूप से enum को एक इंटरफ़ेस में बदल रहा है। –

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

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