2013-06-18 7 views
7
public enum Operations { 

    SINGLE, 
    MULTIPLE; 

    private Type operation; 

    public void setOperation(Type operation) { 
     this.operation = operation; 
    } 

    public Type getOperation() { 
     return operation; 
    } 

    public static void main(String[] args) { 
     Operations oper1 = Operations.SINGLE; 
     oper1.setOperation(Type.GET); 

     Operations oper2 = Operations.SINGLE; 
     oper2.setOperation(Type.POST); 
     System.out.println(oper1.getOperation()); 
     System.out.println(oper2.getOperation()); 
    } 
} 

enum Type { 
    POST, 
    GET; 
} 

उपरोक्त कोड में, ऑपरेशन का मूल्य दोनों ऑपरेशंस के लिए बदल जाता है। ऑपरेशंस के दो उदाहरण कैसे हो सकते हैं। विभिन्न ऑपरेशन प्रकार के साथ।जावा एनम चर स्थिर हैं?

+1

यदि आपने हमें बताया कि stdout को मुद्रित किया गया था तो आपका प्रश्न समझना आसान होगा। (मुझे लगता है कि यह दो बार 'POST' प्रिंट करता है?) –

+0

सिंगल सार्वजनिक स्थिर अंतिम संचालन के समान है SINGLE = नए ऑपरेशंस ("सिंगल", 0) – Blackbelt

उत्तर

12

हां, उदाहरण स्पष्ट रूप से static और final हैं। इसका मतलब है कि कोड मूर्खतापूर्ण है। SINGLE.setOperation(Type) पर कॉल करने वाले दो थ्रेड की कल्पना करें; आप जो भी बुला रहे हैं उसमें आपको कोई भरोसा नहीं होगा।

Java Language Specification, Section 8.9 से:

Enum प्रकार (§8.9) सार घोषित नहीं किया जाना चाहिए; ऐसा करने से एक संकलन-समय त्रुटि होगी।

एक enum प्रकार निश्चित रूप से अंतिम होता है जब तक कि इसमें कम से कम एक enum स्थिरांक होता है जिसमें कक्षा का शरीर होता है।

यह एक संकलन-समय त्रुटि है जो स्पष्ट रूप से अंतिम होने के लिए एक enum प्रकार घोषित करने के लिए है।

नेस्टेड एनम प्रकार निश्चित रूप से स्थैतिक हैं। स्पष्ट रूप से घोंसला वाले एनम प्रकार को स्थिर होने की घोषणा करने की अनुमति है।

और अगले भाग में:

एक enum प्रकार enum स्थिरांक हो सकती है शरीर। एक enum स्थिर enum प्रकार के एक उदाहरण को परिभाषित करता है।

क्योंकि प्रत्येक enum स्थिरता का केवल एक उदाहरण है, तो दो ऑब्जेक्ट संदर्भों की तुलना करते समय बराबर विधि के स्थान पर == ऑपरेटर का उपयोग करने की अनुमति है यदि यह ज्ञात है कि उनमें से कम से कम एक enum स्थिरांक को संदर्भित करता है ।

0

हां, enum के सभी तत्व static final constant हैं। हालांकि darijan द्वारा दूसरे उत्तर में वर्णित अनुसार, आपके कार्यक्रम में एक तार्किक गलती है।

0

main विधि की चौथी पंक्ति में कोई त्रुटि है

oper1.setOperation(Type.POST); 

होना चाहिए

oper2.setOperation(Type.POST); 
+0

जो कोड में टाइपो है – Optional

10

Enum उदाहरणों "स्थिर" (यानी स्थैतिक चर की तरह व्यवहार कर रहे हैं), लेकिन immutable नहीं हैं।

सभी धागे enum नाम से संदर्भित एक ही ऑब्जेक्ट देखते हैं - वे जेवीएम से लौह-पहनावा गारंटी के साथ सिंगलटन की तरह हैं कि एक enum का केवल एक उदाहरण है। एक enum के एक क्षेत्र को बदलने से यह सबके लिए बदल जाता है।

अपने खेतों को final एक enum में बनाने और उन्हें अपरिवर्तनीय बनाने के लिए अच्छा अभ्यास है।

11

मेरे पास संचालन के दो उदाहरण कैसे हो सकते हैं। विभिन्न ऑपरेशन प्रकार के साथ।

एक enum के पीछे मूल विचार एक है, और केवल एक ही, अपने सदस्यों में से प्रत्येक के उदाहरण है कि वहाँ है। यही कारण है कि आप उन्हें समानता के लिए सुरक्षित रूप से तुलना करने की सुविधा देते हैं, बिना किसी डर के कि SINGLE या MULTIPLE किसी अन्य स्थान पर बनाया गया है।

यदि आप SINGLE के कई उदाहरण चाहते हैं, तो इसे class बनाएं, enum पर नहीं। तथ्य यह है कि आपने enum उत्परिवर्तनीय अप्रत्यक्ष रूप से एक ही दिशा में अंक बनाए हैं: enum का उपयोग करके आपकी स्थिति में एक गलत विकल्प है।

2

मैं डेढ़ साल का हूं। लेकिन मुझे लगता है कि सवाल वास्तव में जवाब नहीं दिया गया था।

class Operation { 
    Quantity quantity; 
    Type type; 
    Operation(Quantity quantity, Type type) { 
     this.quantity = quantity; 
     this.type = type; 
    } 
} 

आप, ज़ाहिर है, वर्ग के बजाय enum का उपयोग कर सकते हैं:

समाधान enum के बजाय एक वर्ग, अपने क्षेत्रों के रूप में उन दो enums है कि का उपयोग कर दिया जाएगा। कभी कभी आप वास्तव में, समय के सबसे अधिक है, तथापि, आप शायद class दृष्टिकोण के साथ रहना चाहिए सभी संयोजनों की गणना करना चाहते हैं

enum Operation { 
    SINGLE_GET(Quantity.SINGLE, Type.GET) 
    SINGLE_POST(Quantity.SINGLE, Type.POST) 
    MULTIPLE_GET(Quantity.MULTIPLE, Type.GET) 
    // ... more options 
    // contents same as in class Operation, constructor private by default 
} 

दोनों दृष्टिकोण मान्य हैं,: तो फिर तुम सभी संयोजनों की गणना करने में होगा।

ब्रेवटी के लिए, मैंने Quantity और Type enums को परिभाषित नहीं किया है, वे केवल साधारण enums हैं।

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