2011-06-26 17 views
9

एक enum परिभाषित करते समय एक अच्छा अभ्यास क्या है?Enum प्रथाओं - एक वर्ग/अलग से परिभाषित करें, सार्वजनिक/निजी

उदाहरण के लिए, मेरे पास एक व्यक्ति वर्ग है। इस कक्षा के लिए मैंने एक enum का उपयोग करना चुना है जिसमें मूल्य और महिला है।

क्या एनम को व्यक्ति वर्ग या अलग से परिभाषित किया जाना चाहिए? क्या enum को निजी या सार्वजनिक के रूप में परिभाषित किया जाना चाहिए? इसके अलावा, क्या आपके पास कोई और सलाह है जो एक enum को यथासंभव लचीला उपयोग कर देगा?

उत्तर

8

IMHO, class Person के अंदर इसे public static enum बनाएं।

कारण enum Gender केवल व्यक्ति पर लागू होता है, इसलिए इसे वहां रखें ताकि वे एक साथ बंधे हों (लिंग के पास किसी व्यक्ति के संदर्भ के बिना कोई उपयोग नहीं है)।

उल्टा:

  • कम वर्ग ब्लोट
  • यदि आप किसी अन्य पैकेज/परियोजना के लिए व्यक्ति के लिए कदम, लिंग हमेशा इसके साथ आ जाएगा
  • व्यक्ति, जो केवल उपयोगकर्ता है, "नियंत्रण" है इसके बारे में और के रूप में यह चाहता है यह बदल सकता है, जैसे
    • अधिक enums जोड़ने private List<HealthIssue> genderSpecificHealthIssues;
    • जोड़ने, जैसे TRANSGENDER, 012,, या जो कुछ भी

केवल नकारात्मक पक्ष यह है कि आप इसे उपयोग करने के लिए, यानी import static com.company.Person.Gender.*; एक static आयात का उपयोग करना है।

यह पैटर्न कई जेडीके वर्गों में देखा जाता है, जैसे कि Calendar जो कक्षा कक्षा के अंदर कई दिनांक-संबंधित स्थिरांक को परिभाषित करता है।

3

पूर्ण लचीलापन के लिए, इसे एक स्थिर वर्ग में जोड़ें। लेकिन निश्चित रूप से यह केवल और पूरी तरह से उन enums के लिए है जो पूरे आवेदन में उपयोग करने की आवश्यकता है। स्थानीय और विशेष enums के लिए, उन्हें 'करीबी' रखने के लिए बेहतर है जहां उनका उपयोग किया जाएगा। परीक्षा मुफ्त, मेरे पास एक आईपीहैंडलर क्लास है जो कक्षा उपयोगकर्ता के लिए आईपीवी 4 और आईपीवी 6 पते पारदर्शी हैंडलिंग, पार्सिंग और अनुवाद करता है (आईपीएचंडलर एक स्थिर वर्ग है)। इसमें एक एनम, आईपीटाइप है, जो मूल्य आईपीवी 4 और आईपीवी 6 के साथ है जो कई ऑपरेशन के लिए आईपी हैंडलर के भीतर ही उपयोग किया जाता है। चूंकि इसका कहीं और उपयोग नहीं किया जाता है, इसलिए इसे आईपीएचंडलर कक्षा में परिभाषित किया गया है।

+0

@leon: साझा करने के लिए धन्यवाद। बस पुष्टि करने के लिए, आईपी टाइप का उपयोग सेटर्स/गेटर्स में नहीं किया जाता है और इसे निजी के रूप में परिभाषित किया जाता है? –

+0

@ जेम्स पी। - चूंकि आईपीएचंडलर की विधि कॉल एनम का उपयोग करती है (जैसे _IPHandler.getFormattedLocal (** IPHandler.IPType ipType **)) _, उन्हें अपने मूल वर्ग के बाहर से पहुंच योग्य होना चाहिए। इसका मतलब नहीं है, वे निजी नहीं हो सकते हैं - और सेटर्स नहीं होना चाहिए। क्या जावा इसे अनुमति देता है? – leon

+0

ठीक है, मैं आपको मिलता हूं। जब मैंने गेटर्स और सेटर्स का जिक्र किया तो मेरा मतलब आपके आईपी हैंडलर क्लास के थे। एनम सेट को सार्वजनिक रूप से सुलभ होना आवश्यक है यदि उन्हें विधियों में संदर्भित किया गया हो। इससे मुझे आश्चर्य होता है कि किस मामले में एक अलग जावा फ़ाइल के रूप में एक enum को परिभाषित करना एक अच्छा विचार होगा। पीएस: बस विस्तार के लिए, enums में चर/विधियों को जोड़ा जा सकता है हालांकि ये स्पष्ट रूप से वास्तविक enum मानों को संशोधित नहीं कर सकते हैं। –

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