2011-01-20 9 views
7

हाल ही में, मैंने देखा है, यह संभव है:जावा में, एनम कॉन्स्टेंट को एक और एनम कॉन्स्टेंट के साथ अर्हता प्राप्त करना क्यों संभव है?

class Test { 
    public enum Season { WINTER, SPRING, SUMMER, FALL } 
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible? 
} 

क्या इसके लिए कोई कारण है?

+0

क्या यह 'विंटर के बराबर है। वसंत'? –

+4

सीजन.WINTER.SPRING सीजन के बराबर है। PARRING –

+0

जैच एल सही है। –

उत्तर

10

जब आप जावा में किसी ऑब्जेक्ट (एनम्स समेत) के स्थिर सदस्य तक पहुंचते हैं, तो कंपाइलर प्रभावी रूप से ऑब्जेक्ट को अपने स्थिर प्रकार से बदल देता है। अधिक वस्तुतः,

class ExampleClass { 
    static int staticField; 
    static void staticMethod() { 
     ExampleClass example = new ExampleClass(); 
     example.staticField;  // Equivalent to ExampleClass.staticField; 
     example.staticMethod(); // Equivalent to ExampleClass.staticMethod(); 
    } 
} 

इसी तरह, के बाद से enums प्रभावी रूप से "स्थिर" कर रहे हैं, Season.WINTER.SPRINGSeason.SPRING जैसा होता है; Season.WINTER को इसके enum प्रकार Season के साथ प्रतिस्थापित किया गया है।

एक साइड नोट के रूप में, उदाहरणों से स्थिर सदस्यों तक पहुंच निराश होती है क्योंकि यह काफी उलझन में हो सकती है। उदाहरण के लिए, यदि आपने someThread.sleep() वाले कोड का एक टुकड़ा देखा है, तो आपको यह विश्वास करने में धोखा दिया जा सकता है कि someThread सोया गया है। हालांकि, sleep() स्थिर है, इसलिए कोड वास्तव में Thread.sleep() पर आ रहा है जो वर्तमान धागे को सोता है।

+0

अच्छा , जवाब साफ़ करें। धन्यवाद। –

+0

मैं स्थिर पहुंच के लिए चेतावनियों को चालू करने की अनुशंसा करता हूं (ग्रहण में यह विकल्प है, अन्य आईडीई शायद भी ऐसा करते हैं)। मैं हमेशा उन विशिष्ट कारणों के लिए उन चेतावनियों को ठीक करता हूं: वे उलझन में हैं, और जो कुछ भी सोच रहा है, उसमें कोड पढ़ रहा है, जो कुछ ऐसा नहीं कर रहा है। –

1

ऐसा इसलिए है क्योंकि enums विशेष वर्गों के प्रकार हैं। अगर हम Season.WINTER के अंदर क्षेत्रों पर एक नज़र, उदाहरण के लिए:

for (Field field : Test.Season.WINTER.getClass().getFields()) 
    System.out.println(field); 

हम आउटपुट के रूप में दिखाई देंगे:

public static final TestEnum$Test$Season TestEnum$Test$Season.WINTER 
public static final TestEnum$Test$Season TestEnum$Test$Season.SPRING 
public static final TestEnum$Test$Season TestEnum$Test$Season.SUMMER 
public static final TestEnum$Test$Season TestEnum$Test$Season.FALL 

इसलिए प्रत्येक enum मूल्य वास्तव में भी एक स्थिर निरंतर है enum वर्ग, सीजन, और इसलिए सीजन के स्थिर क्षेत्रों, या अन्य enum मूल्यों (स्वयं सहित) तक पहुंच है।

हालांकि, सीजन.एसपीआरई जैसे सीधे एनम मूल्यों तक पहुंचने के लिए शायद बेहतर है, क्योंकि यह आपके कोड को पढ़ने वाले किसी को भ्रमित करने की सरल और कम संभावना है।

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