2010-04-15 12 views
18

यहां जो कुछ मैं पूरा करने के लिए देख रहा हूं, मेरे पास एक वर्ग है जिसमें कुछ मूल्यों का एक enum है और मैं इसे उपclass करना चाहता हूं और enum में अधिक मूल्य जोड़ना चाहता हूं। यह एक बुरा उदाहरण है, लेकिन:क्या जावा एनम्स का विस्तार करना संभव है?

public class Digits 
{ 
public enum Digit 
{ 
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9 
} 
} 

public class HexDigits extends Digits 
{ 
public enum Digit 
{ 
    A, B, C, D, E, F 
} 
} 

ताकि हेक्सडिगिट्स.डिजिट में सभी हेक्स अंक शामिल हों। क्या यह संभव है?

+1

किया? – bmargulies

+1

उत्तर 'नहीं' है (विवरण के लिए नीचे दिए गए उत्तरों देखें)। जोश बलोच की पुस्तक * प्रभावी जावा * इस के लिए एक अच्छा विवरण और वैकल्पिक हल है। – David

+1

मैंने कोशिश की, इसलिए मैंने यहां पोस्ट किया! – CaseyB

उत्तर

31

नहीं, यह संभव नहीं है। सबसे अच्छा आप कर सकते हैं दो enums लागू और इंटरफ़ेस बनाते हैं और फिर enum के बजाय उस इंटरफ़ेस का उपयोग करें। तो:

interface Digit { 
    int getValue(); 
} 

enum Decimal implements Digit { 
    ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE; 

    private final int value; 

    Decimal() { 
    value = ordinal(); 
    } 

    @Override 
    public int getValue() { 
    return value; 
    } 
} 

enum Hex implements Digit { 
    A, B, C, D, E, F; 

    private final int value; 

    Hex() { 
    value = 10 + ordinal(); 
    } 

    @Override 
    public int getValue() { 
    return value; 
    } 
} 
+0

क्या यह संकलित करता है? मुझे लगता है कि यह नहीं होगा! – Narayan

+0

@ नारायण एक मामूली कंपाइलर त्रुटि थी (अब तय) लेकिन यह अन्यथा काम करता है। – cletus

+0

अच्छा है कि आपने इसे सही किया है, मैंने आपको वैसे भी ऊपर उठाया है :) – Narayan

5

सं

Enums subclassed नहीं किया जा सकता।

तर्क यह है कि एक गणना निश्चित मूल्यों को परिभाषित करती है। सबक्लासिंग इसे तोड़ देगा।

4

नहीं, आप नहीं कर सकते। यदि आप एनम की परिभाषा को देखते हैं, तो इसके उदाहरण अंतिम हैं और विस्तारित नहीं किए जा सकते हैं। यह समझ में आता है अगर आप एक परिमित, अंतिम मानों के सेट के रूप में enums समझते हैं।

वहाँ एक अंक (एक वाक्यात्मक विरूपण साक्ष्य) जो द्विआधारी, दशमलव, हेक्स या जो कुछ भी है, और वास्तविक अर्थ संख्या हो सकता है के बीच एक अंतर है, संख्यात्मक इकाई संदर्भ में एक अंक से वाक्य रचना में प्रतिनिधित्व (आधार प्रणाली ।)

अपने उदाहरण में, आप क्या जरूरत है कानूनीका प्रतिनिधित्व syntatic अंकों के (दशमलव अंक और अक्षर प्रतीकों को निर्दिष्ट

  • enums हैहेक्साडेसिमल; जो है, enum टोकन, और
  • कक्षाएं व्यवहार (या व्याकरण) को निर्दिष्ट वाक्य रचना एक अंक के रूप में कार्य करता है (अंक [वाक्यात्मक] enums का प्रयोग करके) का प्रतिनिधित्व करने के लिए आवश्यक।

यही है कि आपके पास टोकन या प्रतीकों और व्याकरण/व्यवहार हैं जो इंगित करते हैं कि टोकन की एक धारा किसी दिए गए आधार के तहत एक संख्या का प्रतिनिधित्व करती है या नहीं।

लेकिन यह टेंगेंट से थोड़ी दूर है (और जैसा कि आपने कहा था, यह उदाहरण के लिए सिर्फ एक उदाहरण था)। विस्तारित enums पर वापस जा रहे हैं ...

... यो नहीं कर सकते हैं और आपको नहीं करना चाहिए। Enums का मतलब उन चीजों का प्रतिनिधित्व करने के लिए नहीं है जिन्हें बढ़ाया जा सकता है। वे स्थिरस्थिर मान का प्रतिनिधित्व करने के लिए हैं। ऐसी चीजें हैं जो विरासत में नहीं हैं।

इसके अलावा, विस्तार की खातिर विस्तार के जाल में गिर नहीं है या अपने कोड या मॉडल में एक संरचना के लिए मजबूर करने की कोशिश कर के लिए।

यह मानों का एक सेट दूसरे के विस्तार को बनाने के लिए समझ में आता है। अक्सर नहीं, यह नहीं है।व्यवहार या जटिल संरचना का पुन: उपयोग करने के लिए विरासत का उपयोग करें, न केवल उस डेटा से जो उसमें से जुड़े गैर-पुन: प्रयोज्य व्यवहार के साथ कोई संरचना नहीं है।

-5

सहमत हैं कि enum का विस्तार करने के लिए नहीं है ... लेकिन जब टेपेस्ट्री 5 का सामना करना पड़ता है तो घटक का चयन करें ... और इसका enum संस्करण सबसे अच्छा संस्करण है .... (हास्यास्पद रूप से) जटिल वस्तु की तुलना में मॉडलों के उदाहरण वहां मौजूद हैं ... इस मामले के लिए विस्तार और enum आकर्षक कैसे देख सकता है ....

बीटीडब्ल्यू (सीक ग्रिप) जेएसपी ढांचे का निर्माण/सर्वोत्तम अभ्यास करने के बजाए टेपेस्ट्री फेंकने के साथ यह बिल्ली क्या है ? सबसे अच्छे रूप में यह एक ui विकास प्रभाग बनाता है, उस अनुभव imho के लिए जावा प्रौद्योगिकियों कमजोर छोड़ देता है ...

+3

मूल प्रश्न में टेपेस्ट्री का कोई संदर्भ नहीं है, इसलिए यह देखना मुश्किल है कि यह उत्तर प्रश्नकर्ता की सहायता कैसे करेगा। –

0

यह संभव नहीं है। और एक कारण है। कल्पना कीजिए कि आप एक enum का विस्तार कर सकते हैं:

enum A { ONE, TWO } 
enum B extends A { THREE } // for a total { ONE, TWO, THREE } 

अब आप यह कर सकते हैं:

B b = B.THREE 
A a = b // a = B.THREE ? 

लेकिन B.THREEA के लिए एक वैध विकल्प नहीं है।

बेशक आप उन्हें नहीं-बहुरूपी कर सकता है, लेकिन फिर यह वास्तव में विस्तार नहीं है। आप इसे कोशिश

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