2012-03-27 17 views
18
public interface Proposal { 
    public static final enum STATUS { 
     NEW , 
     START , 
     CONTINUE , 
     SENTTOCLIENT 
    }; 
} 

जावा एक इंटरफ़ेस के अंदर final होने की अनुमति नहीं देता है, लेकिन डिफ़ॉल्ट रूप से एक इंटरफ़ेस के अंदर प्रत्येक डेटा सदस्य public static final है। क्या कोई इसे स्पष्ट कर सकता है?जावा एनम अंतिम क्यों नहीं हो सकता है?

+0

क्या आपको लगता है कि "गैर अंतिम" enum किसी भी तरह subclassable है? –

+0

नहीं, मुझे पता था कि enum subclass नहीं हो सकता है, लेकिन जावा हमें इंटरफ़ेस में किसी भी स्थिरता से अंतिम लिखने की स्वतंत्रता देता है लेकिन enum के सामने नहीं, यह आंशिक रूप से यही है कि मैं क्या पूछ रहा था (बस पढ़ने के दौरान उनके दिमाग में क्या है यह?) –

+0

वर्ग/इंटरफ़ेस (और, सिद्धांत रूप में, enum) परिभाषाओं और सदस्य * फ़ील्ड * परिभाषाओं (जो "स्थिरांक" आमतौर पर एक इंटरफ़ेस में होते हैं) के बीच 'अंतिम' का उपयोग करने के बीच एक बड़ा अंतर होता है। एक subclassability को प्रभावित करता है, और दूसरा परिवर्तनशीलता को प्रभावित करता है। –

उत्तर

21

एक enum अंतिम नहीं हो सकता है, क्योंकि संकलक प्रत्येक एनम प्रविष्टि के लिए उप-वर्ग उत्पन्न करेगा जो प्रोग्रामर ने स्पष्ट रूप से कार्यान्वयन को परिभाषित किया है।

इसके अलावा, एक enum जहां JLS section 8.9 द्वारा अपने स्वयं के वर्ग निकाय का कोई उदाहरण नहीं है।

25

जावा आपको एक कक्षा बनाने की अनुमति नहीं देता है जो enum प्रकार का विस्तार करता है। इसलिए, enums खुद हमेशा अंतिम हैं, तो final कीवर्ड का उपयोग कर अनिवार्य है।

बेशक, enum एस अंतिम नहीं हैं क्योंकि आप enum descriptor के अंदर प्रत्येक फ़ील्ड के लिए एक अज्ञात सबक्लास परिभाषित कर सकते हैं। लेकिन final कीवर्ड का उपयोग उन प्रकार के विवरणों को रोकने के लिए बहुत अधिक समझ में नहीं आता है, क्योंकि लोगों को इन सबक्लास को उसी .java फ़ाइल में बनाना होगा, और ऐसा करने के अधिकार वाले किसी भी व्यक्ति को आसानी से final कीवर्ड को आसानी से हटाया जा सकता है । किसी अन्य पैकेज में आपके enum को विस्तारित करने का कोई खतरा नहीं है।

+0

पूरी तरह से भ्रमित उत्तर। यदि आप java.lang.Enum वर्ग के स्रोत को देखते हैं, तो आप देख सकते हैं कि यह अंतिम नहीं बल्कि एक अमूर्त वर्ग है। –

+2

फिर भी, कोई 'enum' प्रकार subclassed किया जा सकता है। –

+5

@EugeneKuleshov: 'एनम' कक्षा सार है क्योंकि आपको इसे विस्तारित करने में सक्षम होना चाहिए। लेकिन वास्तविक 'enum' जो इसे विस्तारित करता है उसे संकलक द्वारा 'अंतिम' कक्षाओं के रूप में परिभाषित किया जाता है। Http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 – StriplingWarrior

6

दो बातें:

  1. enums java.lang.Enum
  2. के अंतिम उपवर्गों कर रहे हैं एक enum एक वर्ग के एक सदस्य है, यह परोक्ष स्थिर है
2

घोषित करने में कोई बिंदु एनम फाइनल कक्षाओं के लिए अंतिम मतलब है कि उन्हें विरासत में नहीं मिला जा सकता है। हालांकि, enums डिफ़ॉल्ट रूप से विरासत में नहीं किया जा सकता है (यह है कि वे अंतिम हैं)।

अंतिम बात केवल चर के लिए मान्य है। हालांकि आपको चर के मुकाबले डेटा प्रकारों की तरह enums के बारे में सोचना चाहिए।

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