2010-01-16 18 views
19

सी/सी ++ में केवल स्थिरांक के संग्रह की बजाय जावा में एनम बनाने के कुछ फायदे क्या हैं?एनम। फायदे?

+0

चेक http://stackoverflow.com/questions/1419835/understanding-enums-in-java/1419849#1419849 – Narayan

उत्तर

24

आप मुक्त संकलन समय मान्य मान की जाँच मिलता है।

public static int OPTION_ONE = 0; 
public static int OPTION_TWO = 1; 

का उपयोग करना सुनिश्चित नहीं करता

void selectOption(int option) { 
... 
} 

केवल एक पैरामीटर मान के रूप में 0 या 1 को स्वीकार करेंगे। एक enum का उपयोग, यह गारंटी है। इसके अलावा, इससे अधिक स्वयं दस्तावेज़ कोड हो जाता है, क्योंकि आप सभी enum मानों को देखने के लिए कोड पूर्णता का उपयोग कर सकते हैं।

+0

इस उत्तर मुख्य लाभ यह है हिट , लेकिन यह कई अन्य फायदों को अनदेखा करता है जो अन्य उत्तरों में विस्तृत हैं। – DJClayworth

4

Enums पहले से ही एक class in Java हैं।

यदि आप पूछ रहे हैं क्यों इस बेहतर है, मैं कहता हूँ चाहते हैं कि बेहतर प्रकार की सुरक्षा और क्षमता एक मात्र क्रमसूचक मूल्य के अलावा अन्य विशेषताएं जोड़ने का तरीका मन में आएगा।

0

Enums अपने आप में एक प्रकार के होते हैं - आप एक enum जो मौजूद नहीं है का उपयोग नहीं कर सकते हैं या किसी अन्य समान निरंतर तलाश में डाल दिया। और, आप उन्हें समझा सकते हैं, ताकि कोड अधिक संक्षिप्त हो।

का उपयोग कर स्थिर स्थिरांक संभावित रखरखाव बुरे सपने का कारण बन सकता - खासकर यदि वे क्षेत्र से बाहर फैल गया।

11

टाइप सुरक्षा एक कारण है।

एक और, that I find more important, कि आप जावा में मूल्यों Enum मेटाडाटा संलग्न कर सकते हैं है। उदाहरण के लिए, यदि आप एक वेब सेवा के लिए कानूनी आपरेशन के सेट को परिभाषित करने के लिए एक enum इस्तेमाल कर सकते हैं, और फिर अनुरोध करता है और डेटा वर्ग के प्रकार के लिए मेटाडाटा देते हैं:

AddItem(HttpMethod.POST, ProductEntry.class), 
+2

इस से सावधान रहें। मैंने अक्सर कक्षाओं के बजाय गुणों के साथ enums का उपयोग कर लोगों को देखा है।यह आसपास के कोड का कारण बन सकता है जो प्रकृति में बहुत अजीब और स्थैतिक (प्रभावी रूप से enums में वस्तुओं को इंजेक्ट करने की कोशिश कर रहा है) के रूप में enum का उपयोग कर सकते हैं क्योंकि वे एक उचित वर्ग में enum कहा और refactor हिट लेने के बजाय enum रखने के लिए अविश्वसनीय उत्सुक हैं। – DaveC

+1

यह बहुत पैथोलॉजिकल लगता है; एक उदाहरण देखना चाहते हैं। तो शायद कुछ नियम क्रम में हैं: कोई परिवर्तनीय स्थिति नहीं, और कोई व्यवहार नहीं। – kdgregory

3

बेहतर प्रकार सुरक्षा के अलावा, आप भी परिभाषित कर सकते हैं अपने enums में कस्टम व्यवहार (कुछ अच्छे उदाहरणों के लिए Effective Java देखें)।

1

बनाना enum एक संदर्भ प्रकार है कि स्थिरांक की नियत सेट शामिल कर सकते हैं EnumMap और कार्यान्वयन EnumSet (JDK वर्ग) की तरह सेट की तरह कार्यान्वयन कुशल मानचित्र के लिए प्रेरित किया।
एक विशेष enum प्रकार कुंजी के साथ उपयोग के लिए मानचित्र कार्यान्वयन:

EnumMap की जावाडोक से

। नक्शा बनाया गया है, जब एक enum मानचित्र में सभी कुंजी एक enum प्रकार से आना चाहिए जो निर्दिष्ट, स्पष्ट रूप से या स्पष्ट रूप से निर्दिष्ट है। Enum नक्शे आंतरिक रूप से सरणी के रूप में प्रतिनिधित्व कर रहे हैं। यह प्रतिनिधित्व बेहद कॉम्पैक्ट और कुशल है।

EnumMap समृद्धि को जोड़ता है और एक सरणी की गति के साथ मानचित्र की सुरक्षा टाइप करता है (Effective Java)।

0

केवल वास्तविक लाभ यह है कि इसका उपयोग switch कथन में किया जा सकता है। अन्य सभी चीजें एक enum सक्षम है जो सादे वेनिला वर्ग के साथ private कन्स्ट्रक्टर के साथ किया जा सकता है जिसका बदले में बदले में कक्षा के वर्गों (टाइपएफ़ पैटर्न) के public static final फ़ील्ड घोषित किए जाते हैं। Enum का दूसरा लाभ स्पष्ट रूप से है कि यह एक सादे वेनिला वर्ग के साथ कोड की तुलना में कोड कम verbose बनाता है।

लेकिन अगर मुझे गलत नहीं लगता है, तो सी ++ (या यह सी #?) में आप Stringswitch कथन में उपयोग कर सकते हैं। इसलिए जावा में enums का लाभ नगण्य है C++ के विपरीत। हालांकि, जावा 7 के लिए एक ही चीज़ का प्रस्ताव था, यह सुनिश्चित नहीं है कि यह इसे बनाएगा या नहीं।

6

जावा 5 enums Joshua Bloch के Effective Java (प्रथम संस्करण) से एक typesafe enum पैटर्न से उत्पन्न में C/C++/सी # enums का नुकसान (जो केवल बारीकी-अप्रत्यक्ष पूर्णांक स्थिरांक हैं) और जावा में उपयोग से बचने के लिए अंतिम स्थैतिक int स्थिरांक का।

मुख्य रूप से int स्थिरांक और int enums टाइपएफ़ नहीं हैं। आप किसी भी int मूल्य में गुजर सकते हैं। C/C में आप यह कर सकते हैं ++:

enum A { one, two, three }; 
enum B { beef, chicken, pork } b = beef; 

void func(A a) { ... } 
func((A)b); 

दुर्भाग्य से प्रभावी जावा से typesafe enum पैटर्न बॉयलरप्लेट का एक बहुत, सभी नहीं इसके बारे में स्पष्ट था। सबसे उल्लेखनीय है कि आपको निजी विधि readResolve को deserialization पर नए उदाहरण बनाने से रोकने के लिए ओवरराइड करना था, जो सरल संदर्भ जांच को तोड़ देगा (यानी equals() के बजाय == ऑपरेटर का उपयोग करना)।

तो जावा 5 enums ints पर इन लाभ प्रदान करते हैं:

  • प्रकार सुरक्षा;
  • जावा 5 enums व्यवहार और इंटरफेस लागू कर सकते हैं;
  • जावा 5 एनम्स में EnumSet और EnumMap जैसे कुछ हल्के हल्के डेटा संरचनाएं हैं।

जावा वर्गों बस का उपयोग करने पर इन फायदों से अधिक 5 enums:

  • त्रुटि-रहित होता बॉयलरप्लेट (निजी निर्माता, readResolve() आदि);
  • अर्थपूर्ण शुद्धता। आप देखते हैं कि कुछ एक enum है और आप जानते हैं कि यह सिर्फ एक मूल्य का प्रतिनिधित्व कर रहा है। आप एक कक्षा देखते हैं और आप निश्चित नहीं हैं। शायद कहीं एक स्थैतिक कारखाना विधि है, आदि जावा 5 enums अधिक स्पष्ट रूप से इरादा इंगित करता है।
+0

'readResolve() 'को ओवरराइड करने का यह एक बड़ा सौदा नहीं है। मैं नियमित रूप से उदाहरणों की सीमित संख्या वाले कक्षाओं के लिए ऐसा करता हूं। कभी-कभी 'enum' उन वर्गों की परिभाषा को सरल बनाता है, कभी-कभी नहीं। इस काम के लिए सही उपकरण का उपयोग करें। – finnw

2

आप को प्रभावी ढंग से लागू करने के लिए Singletons ^^ enums उपयोग कर सकते हैं:

public enum Elvis { 
    INSTANCE 
} 
+1

-1 - आपको सिंगलेट्स से बचना चाहिए, उन्हें "प्रभावी ढंग से कार्यान्वित करने" के तरीकों को नहीं ढूंढना चाहिए (यह दृष्टिकोण, आकस्मिक रूप से, लोड-टाइम प्रारंभिकता है, जो डीबग करने के लिए अविश्वसनीय रूप से दर्दनाक है) – kdgregory

+1

मैं बस यह इंगित करना चाहता था कि अगर आपको चाहिए/चाहें सिंगलेट्स का उपयोग करने के लिए, जावा – helpermethod

+9

बीटीडब्लू में ऐसा करने का सबसे अच्छा तरीका है, सिंगलेट्स डीओ का उपयोग – helpermethod

0

Enumerations का प्रयोग के लाभ: एक वस्तु एक गणन के रूप में एक ही तरीके से काम करने के लिए बनाया जा सकता है। वास्तव में, संस्करण 5.0 तक जावा भाषा में भी शामिल नहीं थे। हालांकि, गणनाएं कोड को और अधिक पठनीय बनाती हैं और प्रोग्रामर त्रुटि के लिए कम कमरा प्रदान करती हैं।

ओसीए जावा SE 7 प्रोग्रामर मैं अध्ययन गाइड