2010-07-29 10 views
6

क्या जावा में ऐसा कुछ परिभाषित करना संभव है?संख्या?

सी # कोड:

public enum Character 
{ 
    A = 1, 

    B = 2, 

    C = 4, 

    D = 8 

} 


... 

Character ch = /* from user */ 

if(ch & Character.A) 
{ 
    // some operation... 
} 

उदाहरण के लिए यदि ch सेट Character.B तो if का परिणाम false हो जाएगा:

ch = 00000000 00000000 00000000 00000010 
A = 00000000 00000000 00000000 00000001 
------------------------------------------ 
& 00000000 00000000 00000000 00000000 

मैं ऐसा ही कुछ को लागू करना चाहते हैं! जावा में कभी भी संभव है?

उत्तर

17

ठीक है, आप लगभग कि कर सकते हैं:

public enum CharEnum // Let's avoid java.lang.* clashes 
{ 
    A(1), B(2), C(4), D(8); 

    private final int mask; 

    private CharEnum(int mask) 
    { 
     this.mask = mask; 
    } 

    public int getMask() 
    { 
     return mask; 
    } 
} 

तब:

CharEnum ch = /* from user */ 

if ((ch.getMask() & CharEnum.A.getMask()) > 0) 
{ 
    // some operation... 
} 

यह कुछ स्थितियों में उपयोगी हो सकता है, लेकिन जैसा कि माइकल ने कहा कि आप निश्चित रूप से सामान्य के लिए EnumSet पर गौर करना चाहिए "मूल्यों का सेट" विकल्प।

यदि आप मूल्यों के साथ एक enum के लिए जाने का निर्णय करते हैं, आप enum के भीतर ही अतिरिक्त तर्क रख सकते हैं:

public enum CharEnum 
{ 
    // Other code as before 

    public boolean overlapsWith(CharEnum ch) 
    { 
     return (ch.mask & mask) > 0; 
    } 
} 
+0

आपको कुछ कोष्ठक जोड़ना चाहिए: 'if ((ch.getMask() और CharEnum.A.getMask())> 0)' –

+0

@ ट्राउ सॉफ्ट: फिक्स्ड, धन्यवाद। –

4

आप क्रमसूचक() विधि का उपयोग कर सकते प्राप्त करने के लिए (बेशक, Character अपने enum के नाम के रूप में चुनने बहुत भ्रामक यह जो स्वचालित रूप से हर संकलन इकाई में आयात किया जाता java.lang.Character के साथ कोई विरोध बनाता है के रूप में है) एक enum स्थिर के साथ जुड़े पूर्णांक। वैसे भी, मुझे एहसास हुआ कि आप जो हासिल करने की कोशिश कर रहे हैं उसे एनम-परिभाषित तरीकों से महसूस किया जा सकता है। मेरा मतलब है, जावा के enum सी/सी ++ की तुलना में अधिक शक्तिशाली हैं क्योंकि आप उनके साथ व्यवहार को जोड़ सकते हैं। इस प्रकार, आप एक क्षेत्र है जो यह मान का आयोजन करेगा परिभाषित कर सकते हैं, और निर्माता यह प्रारंभ हो

:

public enum Chr { 
    A(1), 
    B(2), 
    C(4), 
    D(8) 
    ; 

    public Chr(int n) { value = n; }   
    public final int value; 
    } 



    Character ch = ... // from user 
    if(ch & Chr.A.value) { 
    ... 
    } 
2

आप का उपयोग कर ऐसा ही कुछ कर सकता है

public enum Chr { 
    A { 
     @Override public void doSomething(int c) { 
     // some operation ... 
     } 
    }, 
    B, 
    C, 
    D; 

    public void doSomething(int c) { 
     // some default behavior 
    } 
    } 

अपनी टिप्पणी के बाद Enum.ordinal(), लेकिन यह वास्तव में खराब डिजाइन होगा। सेट ऑपरेशन के लिए आपको समानता तुलना के लिए == और EnumSet का उपयोग करना चाहिए।

1

मैं इटाय से सहमत हैं, और थोड़ा आगे मेरा सुझाव प्राप्त करने के लिए Effective Java Second Edition का पठन जावा एनम्स पर एक पूर्ण अध्याय वास्तव में दिलचस्प है।

1

मैं माइकल बोर्गवर्ड और जॉन स्कीट से सहमत हूं कि EnumSet पर ध्यान देने योग्य है। मैंने EnumSet को आपके जैसे बिटवाई ऑपरेशंस पर चुना होगा, इसलिए मैं दिखाऊंगा कि EnumSet का उपयोग कैसे करें।

 

यह अपने Character enum की तरह लग रहा CharEnum एक सा क्षेत्र है, जहां प्रत्येक enum सिर्फ एक बिट सेट के साथ एक पूर्णांक मान है की तरह इस्तेमाल किया जा रहा है (के अब से यह CharEnum कॉल):

A = 00000000 00000000 00000000 00000001 
B = 00000000 00000000 00000000 00000010 
C = 00000000 00000000 00000000 00000100 
D = 00000000 00000000 00000000 00001000 

यह आपके लिए EnumSet के समान है; इसमें एक आंतरिक बिट वेक्टर है जो स्वचालित रूप से प्रत्येक enum को long पर थोड़ा सा असाइन करता है। इसके लिए JavaDoc कहते हैं, बिट झंडे "इस वर्ग के स्थान और समय के प्रदर्शन काफी अच्छा एक उच्च गुणवत्ता वाले, पारंपरिक पूर्णांक आधारित करने के लिए typesafe विकल्प के रूप में इसके उपयोग की अनुमति के लिए होना चाहिए।" "

यहाँ एक है यह कैसे

public enum CharEnum { 
    A, B, C, D; 
} 

और फिर

EnumSet<CharEnum> ch = /* from user */ 

if (ch.contains(CharEnum.A)) { 
    // some operation... 
} 

कोई ज़रूरत नहीं उपयोग करने के लिए तो यह बहुत सरल कोड है कहीं भी बिट्स निर्दिष्ट करने के लिए, का उदाहरण!

एक चेतावनी: यह केवल इसलिए काम करता है क्योंकि आपके सी # उदाहरण में enum मानों में से केवल एक बिट सेट होता है। आप इस तरह से एक enum मूल्य था:

E = 00011000 01110111 11100101 10000101 

तो एक EnumSet उचित नहीं होगा। उस स्थिति में आपको यहां अन्य उत्तरों में से एक को देखना चाहिए।