दिलचस्प पोस्ट
यूनिक्स / लिनक्स शैल में मिलान करने के बाद मैं व्युत्क्रम या नकारात्मक वाइल्डकार्ड का उपयोग कैसे कर सकता हूं? वर्ग के नाम से तत्व कैसे प्राप्त करें? कैमरा गतिविधि रिक्त एंड्रॉइड वापस आ रही है नोड। जेएसएस के साथ MySQL एक्स-मैक्रोज का असली दुनिया का उपयोग सी में एक फ़ंक्शन में पास किए गए एक पॉइंटर को मैं कैसे संशोधित करूं? क्या रीकैपटा को टूट गया / हैक किया गया है / ओसीआरड / हार / टूटा हुआ है? क्या किसी साइट से वीडियो डाउनलोड करने से बचाया जा सकता है? पायथन कोड ओब्बुस्केक्शन घटना जब window.location.href में परिवर्तन दृश्य स्टूडियो में एएसएम से सी मानक पुस्तकालय फ़ंक्शन कॉल करें IOS क्रैश डंप में कस्टम डेटा शामिल करना HTML प्रपत्र में टेक्स्ट पेस्ट करना अक्षम करें उपयोगकर्ता द्वारा पुश नोटिफिकेशन सक्षम किए जाने पर iPhone पर निर्धारित करें कैसे आईफोन क्षुधा के लिए एकाधिक थीम्स / खाल बनाने के लिए?

क्या हैं और वे उपयोगी क्यों हैं?

आज मैं इस साइट पर कुछ प्रश्नों के माध्यम से ब्राउज़ कर रहा था और मुझे इस बात का उल्लेख मिला है कि ऐसे समाधान के लिए थ्रेड सुरक्षा लाभों के बारे में सिंगलटन पैटर्न में इस्तेमाल होने वाली एक enum का उल्लेख किया गया है ।

मैंने कभी भी enum इस्तेमाल नहीं किया है और मैं अब जावा से प्रोग्रामिंग कर रहा हूं जो एक साल से ज्यादा है। और जाहिरा तौर पर उन्होंने बहुत कुछ बदल दिया अब वे स्वयं के भीतर ओओपी के पूर्ण विकसित समर्थन भी करते हैं।

अब दिन और दिन के प्रोग्रामिंग के लिए मुझे और क्या उपयोग करना चाहिए?

वेब के समाधान से एकत्रित समाधान "क्या हैं और वे उपयोगी क्यों हैं?"

जब आप एक चर (विशेष रूप से एक विधि पैरामीटर) केवल संभावित मूल्यों के एक छोटे से सेट में से एक ले सकते हैं, तो आपको हमेशा एनोम का उपयोग करना चाहिए। उदाहरण प्रकार स्थिरांक (अनुबंध की स्थिति: "स्थायी", "अस्थायी", "अपरेंटिस"), या झंडे ("अब निष्पादित करें," "निष्कासन निष्पादन") जैसी चीजें होगी।

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

बीटीडब्लू (बीटीडब्ल्यू), अर्थों का अति प्रयोग होने का मतलब यह हो सकता है कि आपके तरीके बहुत अधिक करते हैं (यह अक्सर एक विधि के बजाय कई अलग-अलग तरीकों के लिए बेहतर होता है, जो कई फ्लैग लेता है जो इसे संशोधित करता है), लेकिन अगर आपको झंडे या प्रकार कोड का उपयोग करना है, तो जाने के लिए रास्ता हैं

एक उदाहरण के रूप में, जो बेहतर है?

 /** Counts number of foobangs. * @param type Type of foobangs to count. Can be 1=green foobangs, * 2=wrinkled foobangs, 3=sweet foobangs, 0=all types. * @return number of foobangs of type */ public int countFoobangs(int type) 

बनाम

 /** Types of foobangs. */ public enum FB_TYPE { GREEN, WRINKLED, SWEET, /** special type for all types combined */ ALL; } /** Counts number of foobangs. * @param type Type of foobangs to count * @return number of foobangs of type */ public int countFoobangs(FB_TYPE type) 

एक विधि कॉल की तरह:

 int sweetFoobangCount = countFoobangs(3); 

तो हो जाता है:

 int sweetFoobangCount = countFoobangs(FB_TYPE.SWEET); 

दूसरे उदाहरण में, यह तुरंत स्पष्ट होता है कि किस प्रकार की अनुमति है, डॉक्स और कार्यान्वयन सिंक से बाहर नहीं जा सकते, और संकलक इस को लागू कर सकता है साथ ही, एक अमान्य कॉल की तरह

 int sweetFoobangCount = countFoobangs(99); 

अब संभव नहीं है

किसी भी प्रोग्रामिंग भाषा की सुविधा का उपयोग क्यों करें? इसके कारण हमारे पास भाषाएं हैं

  1. प्रोग्रामर्स कुशलतापूर्वक और सही तरीके से एल्गोरिदम को एक फॉर्म कंप्यूटर में व्यक्त करने के लिए उपयोग कर सकते हैं।
  2. एल्गोरिदम दूसरों को लिखा है और सही ढंग से परिवर्तन कर रहे हैं समझने के लिए रखरखाव।

एनोम्स बॉयलरप्लेट को बिना लिखे हुए शुद्धता और पठनीयता दोनों के समान होने में सुधार करते हैं यदि आप बॉयलरप्लेट लिखने के लिए तैयार हैं, तो आप "अनुकरण" ईम्हें कर सकते हैं:

 public class Color { private Color() {} // Prevent others from making colors. public static final Color RED = new Color(); public static final Color AMBER = new Color(); public static final Color GREEN = new Color(); } 

अब आप लिख सकते हैं:

 Color trafficLightColor = Color.RED; 

ऊपर बॉयलरप्लेट में उतना ही प्रभाव होता है जितना

 public enum Color { RED, AMBER, GREEN }; 

दोनों संकलक से एक ही स्तर की जांच की सहायता प्रदान करते हैं। बॉयलरप्लेट सिर्फ अधिक टाइपिंग है लेकिन बहुत से टाइपिंग की बचत प्रोग्रामर को अधिक कुशल बनाता है (1 देखें), इसलिए यह एक सार्थक सुविधा है।

यह भी कम से कम एक और कारण के लिए सार्थक है:

स्विच स्टेटमेंट

एक बात यह है कि ऊपर static final enum सिमुलेशन आपको अच्छा switch मामलों नहीं दे रहा है। एन्यूम प्रकारों के लिए, जावा स्विच इनम मामलों के दायरे का अनुमान लगाने के लिए अपनी चर के प्रकार का उपयोग करता है, इसलिए आपके ऊपर दी गई enum Color लिए केवल यह कहना आवश्यक है:

 Color color = ... ; switch (color) { case RED: ... break; } 

ध्यान दें कि मामलों में यह Color.RED नहीं है। यदि आप एंमान का उपयोग नहीं करते हैं, तो switch साथ नामित मात्रा का उपयोग करने का एकमात्र तरीका कुछ ऐसा है:

 public Class Color { public static final int RED = 0; public static final int AMBER = 1; public static final int GREEN = 2; } 

लेकिन अब एक रंग को पकड़ने वाला एक चर टाइप प्रकार int होना चाहिए। Enum का अच्छा संकलक चेक और static final सिमुलेशन चला गया है खुश नहीं।

एक समझौता सिमुलेशन में एक स्केलर-मूल्यवान सदस्य का उपयोग करना है:

 public class Color { public static final int RED_TAG = 1; public static final int AMBER_TAG = 2; public static final int GREEN_TAG = 3; public final int tag; private Color(int tag) { this.tag = tag; } public static final Color RED = new Color(RED_TAG); public static final Color AMBER = new Color(AMBER_TAG); public static final Color GREEN = new Color(GREEN_TAG); } 

अभी व:

 Color color = ... ; switch (color.tag) { case Color.RED_TAG: ... break; } 

लेकिन ध्यान दें, और भी बॉयलरप्लेट!

सिंगलटन के रूप में एक एन्यूम का उपयोग करना

ऊपर बॉयलरप्लेट से आप देख सकते हैं कि एक एएनयू एक सिंगलटन को कार्यान्वित करने का तरीका क्यों प्रदान करता है। लेखन के बजाय:

 public class SingletonClass { public static final void INSTANCE = new SingletonClass(); private SingletonClass() {} // all the methods and instance data for the class here } 

और उसके बाद इसे एक्सेस करना

 SingletonClass.INSTANCE 

हम सिर्फ कह सकते हैं

 public enum SingletonClass { INSTANCE; // all the methods and instance data for the class here } 

जो हमें एक ही चीज़ देता है हम इसके साथ भाग ले सकते हैं क्योंकि जावा एंवाम को पूर्ण कक्षा के रूप में कार्यान्वित किया जाता है, केवल शीर्ष पर शीर्ष पर छिद्र के साथ ही थोड़ा सा वाक्यविन्यास चीनी होता है। यह फिर से कम बॉयलरप्लेट है, लेकिन यह स्पष्ट नहीं है जब तक कि मुहावरे आपसे परिचित नहीं होते। मैं भी इस तथ्य को नापसंद करता हूं कि आप विभिन्न एनएम कार्यों को प्राप्त करते हैं, हालांकि वे सिंगलटन: ord और values आदि के लिए ज्यादा समझ नहीं पाते हैं। (वास्तव में एक जटिल सिमुलेशन जहां Color extends Integer , जो स्विच के साथ काम करेगा, लेकिन ऐसा है मुश्किल यह भी स्पष्ट रूप से दिखाता है कि क्यों enum एक बेहतर विचार है।)

धागा सुरक्षा

थ्रेड सुरक्षा एक संभावित समस्या है, जब कोई एकल लॉकिंग के साथ सिंगलटन लज्ज़िले नहीं बनाए जाते

 public class SingletonClass { private static SingletonClass INSTANCE; private SingletonClass() {} public SingletonClass getInstance() { if (INSTANCE == null) INSTANCE = new SingletonClass(); return INSTANCE; } // all the methods and instance data for the class here } 

यदि कई धागे एक ही समय में INSTANCE करते हैं, जबकि INSTANCE अभी भी शून्य है, किसी भी संख्या में उदाहरण बनाया जा सकता है। ये गलत है। एकमात्र समाधान चर INSTANCE रक्षा के लिए synchronized एक्सेस जोड़ना है।

हालांकि, ऊपर static final कोड में यह समस्या नहीं है। यह उदाहरण के लिए कक्षा भार समय पर बेसब्री से बनाता है कक्षा लोडिंग सिंक्रनाइज़ है।

enum सिंगलटन प्रभावी ढंग से आलसी है क्योंकि इसका उपयोग पहले उपयोग के लिए नहीं किया गया है। जावा आरंभीकरण भी सिंक्रनाइज़ किया जाता है, इसलिए कई थ्रेड INSTANCE एक से अधिक उदाहरण को प्रारंभ नहीं कर सकते। तुम बहुत कम कोड के साथ एक lazily initialized सिंगलटन हो रही है एकमात्र ऋणात्मक यह है कि असंगत सिंटेक्स। आपको मुहावरे को जानने की जरूरत है या यह समझने की ज़रूरत है कि क्लास लोडिंग और इनिशियलाइजेशन काम कैसे हो रहा है यह जानने के लिए।

पहले से उल्लेख किए गए उपयोग-मामले के अलावा, मैं अक्सर कुछ मूल OOP दिशानिर्देशों के बाद रणनीति पैटर्न को लागू करने के लिए उपयोगी पाता है:

  1. ऐसा कोड रखने के लिए जहां डेटा है (अर्थात, एएन्यूम में ही – या प्राय: एन्यूएम स्थिरांक के भीतर, जो तरीकों को ओवरराइड कर सकता है)।
  2. क्लाइंट कोड को enum में बाँध नहीं करने के लिए इंटरफ़ेस (या अधिक) को कार्यान्वित करना (जो कि केवल डिफ़ॉल्ट लागूकरण का एक सेट प्रदान करना चाहिए)

सरलतम उदाहरण Comparator कार्यान्वयन का एक सेट होगा:

 enum StringComparator implements Comparator<String> { NATURAL { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }, REVERSE { @Override public int compare(String s1, String s2) { return -NATURAL.compare(s1, s2); } }, LENGTH { @Override public int compare(String s1, String s2) { return new Integer(s1.length()).compareTo(s2.length()); } }; } 

यह "पैटर्न" अधिक जटिल परिदृश्यों में इस्तेमाल किया जा सकता है, जो इनम के साथ आने वाले सभी उपहारों का व्यापक उपयोग करते हैं: उदाहरणों पर चलना, उनके निहित आदेश पर निर्भर करते हुए, नाम का एक उदाहरण प्राप्त करना, सही तरीके से प्रदान करने वाली स्थिर विधियां विशिष्ट संदर्भों के लिए आदि। और फिर भी आपके पास यह सब अंतरफलक के पीछे छिपा हुआ है, ताकि आपके कोड कस्टम कार्यान्वयन के साथ बिना किसी संशोधन के काम करेगा, अगर आप ऐसा कुछ चाहते हैं जो "डिफ़ॉल्ट विकल्पों" में उपलब्ध नहीं है।

मैंने इसे बार ग्रैन्यूलिटी (दैनिक, साप्ताहिक, आदि) की अवधारणा के मॉडलिंग के लिए सफलतापूर्वक लागू किया है, जहां सभी तर्क को एक एन्यूम में समझाया गया था (किसी निश्चित समय सीमा के लिए सही ग्रैन्युलैरिटी चुनना, प्रत्येक ग्रैन्यूलिटी के लिए निरंतर तरीकों आदि) और फिर भी, सेवा स्तर द्वारा देखे जाने वाले Granularity केवल एक इंटरफ़ेस थीं।

अन्य उत्तरों में से कोई भी ऐसा नहीं है जो enums को विशेष रूप से शक्तिशाली बनाने के लिए टेम्पलेट विधियों की क्षमता है। तरीकों आधार enum का हिस्सा हो सकता है और प्रत्येक प्रकार से ओवरराइड किया जा सकता है। और, enum से जुड़ी व्यवहार के साथ, यह अक्सर अगर-दूसरे निर्माण या स्विच स्टेटमेंट की आवश्यकता को समाप्त करता है क्योंकि यह ब्लॉग पोस्ट दर्शाता है – जहां enum.method() को मूलतः सशर्त के अंदर निष्पादित किया जाएगा। इसी उदाहरण में एटम के साथ स्थैतिक आयात का भी पता चलता है और साथ ही कोड जैसे बहुत क्लीनर डीएसएल का उत्पादन होता है।

कुछ अन्य रोचक गुणों में यह तथ्य शामिल है कि enums equals() , toString() और hashCode() लिए कार्यान्वयन प्रदान करते हैं और hashCode() और Comparable कार्यान्वित करते हैं

सभी एंटमों के एक पूर्ण रडोन के लिए मुझे प्रस्ताव करना है कि मैं ब्रुस एकलेल की सोच को जावा 4 संस्करण में सुझाता हूं जो विषय के पूरे अध्याय को समर्पित करता है। विशेष रूप से रोशन, उदाहरणों में एक रॉक, पेपर, कैंची (यानी RoShamBo) गेम को एनम्यूज़ के रूप में शामिल किया गया है।

जावा दस्तावेजों से –

स्थिरांक सेटों का प्रतिनिधित्व करने के लिए आपको किसी भी समय एंज प्रकार का उपयोग करना चाहिए। इसमें प्राकृतिक enum प्रकार जैसे हमारे सौर मंडल और डेटा सेट्स के ग्रह शामिल हैं, जहां आप समय को संकलित करने में सभी संभव मूल्य जानते हैं- उदाहरण के लिए, मेनू पर विकल्पों, कमांड लाइन झंडे, और इसी तरह।

एक सामान्य उदाहरण है एक वर्ग को एक स्थिर प्रकार के स्थिर स्थिरांक (स्थिरांक के उचित संख्या के भीतर) के एक एंटम प्रकार के साथ सेट करना। असल में यदि आपको लगता है कि आप संकलन समय पर "कुछ" के सभी संभावित मूल्यों को जानते हैं तो आप इसे एक एन्यूम प्रकार के रूप में प्रतिनिधित्व कर सकते हैं। Enums स्थिरता के साथ एक वर्ग पर पठनीयता और लचीलेपन प्रदान करते हैं

कुछ अन्य फायदे हैं जो मैं एंम प्रकारों के बारे में सोच सकता हूं। वे हमेशा एक विशिष्ट मान वर्ग का एक उदाहरण होते हैं (इसलिए सिंगलटन के रूप में एनोम्स का उपयोग करने की अवधारणा) एक अन्य लाभ यह है कि आप स्विच-केस स्टेटमेंट में एक प्रकार के रूप में एनोम का उपयोग कर सकते हैं। इसके अलावा आप उन्हें पढ़ने योग्य स्ट्रिंग के रूप में प्रिंट करने के लिए enum पर स्ट्रिंग () का उपयोग कर सकते हैं।

अब दिन और दिन के प्रोग्रामिंग में मुझे एंज का उपयोग क्यों करना चाहिए?

पठनीयता बढ़ने के दौरान आप एक छोटे से स्थिर स्थिरांक या आंतरिक कक्षा मोड का प्रतिनिधित्व करने के लिए एक ऐनम का उपयोग कर सकते हैं। इसके अलावा, विधि पैरामीटर में उपयोग किए जाने पर एनोम एक निश्चित कठोरता को लागू कर सकते हैं। वे ओरेकल की साइट पर ग्रहों के उदाहरण की तरह एक कंस्ट्रक्टर को जानकारी देने की दिलचस्प संभावना प्रदान करते हैं और जैसे ही आपने पाया है, एक सिंगलटन पैटर्न बनाने का एक आसान तरीका भी अनुमति देता है।

उदा: Locale.setDefault(Locale.US) Locale.setDefault(1) से बेहतर पढ़ता है और जब आप जोड़ते हैं तो आईडीई में दिखाए गए मूल्यों के निश्चित सेट के उपयोग को लागू करता है सभी पूर्णांक के बजाय विभाजक

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

क्यों नहीं String , या int के बजाय Enum , स्थिरांक के लिए?

  1. कंपाइलर टाइपोस की अनुमति नहीं देगा, न तो निश्चित सेट के बाहर का मूल्य, जैसा कि एंमान स्वयं के प्रकार हैं परिणाम:
    • अपनी बहस को आश्वस्त करने के लिए आपको एक पूर्व-शर्त (या मैन्युअल रूप से) लिखना नहीं होगा जो वैध श्रेणी में है।
    • प्रकार अपरिवर्तक मुफ्त में आता है
  2. Enums व्यवहार हो सकता है, बस किसी भी अन्य वर्ग के रूप में
  3. String एस का उपयोग करने के लिए संभवतः आपको एक समान मात्रा की स्मृति की आवश्यकता होगी, वैसे भी (यह Enum की जटिलता पर निर्भर करता है)

इसके अलावा, Enum प्रत्येक उदाहरण एक वर्ग है, जिसके लिए आप अपने व्यक्तिगत व्यवहार को परिभाषित कर सकते हैं।

इसके अलावा, वे उदाहरणों के निर्माण पर थ्रेड सुरक्षा को आश्वस्त करते हैं (जब एन्यूम लोड होता है), जो सिंगलटन पैटर्न को सरल बनाने में बहुत अच्छा अनुप्रयोग दिखाता है

यह ब्लॉग इसके कुछ अनुप्रयोगों को दिखाता है, जैसे पारसर के लिए एक स्टेट मशीन

सभी के अलावा अन्य लोगों ने कहा .. एक पुरानी परियोजना में जिसके लिए मैं काम करता था, संस्थाओं (स्वतंत्र अनुप्रयोग) के बीच बहुत सारे संचार पूर्णांक का उपयोग कर रहे थे जो एक छोटे से सेट का प्रतिनिधित्व करते थे value और उपाध्यक्षों से enum ऑब्जेक्ट प्राप्त करने के लिए स्थिर विधियों के साथ सेट को घोषित करने के लिए यह उपयोगी था। कोड क्लीनर देखा गया, स्विच केस प्रयोज्य और लॉग करने के लिए आसान लेखन।

 enum ProtocolType { TCP_IP (1, "Transmission Control Protocol"), IP (2, "Internet Protocol"), UDP (3, "User Datagram Protocol"); public int code; public String name; private ProtocolType(int code, String name) { this.code = code; this.name = name; } public static ProtocolType fromInt(int code) { switch(code) { case 1: return TCP_IP; case 2: return IP; case 3: return UDP; } // we had some exception handling for this // as the contract for these was between 2 independent applications // liable to change between versions (mostly adding new stuff) // but keeping it simple here. return null; } } 

ProtocolType.fromInt(2) myEnumObj.name ProtocolType.fromInt(2) का उपयोग करते हुए प्राप्त मूल्यों से myEnumObj.name ऑब्जेक्ट बनाएँ (जैसे 1,2) myEnumObj.name का उपयोग कर लॉग myEnumObj.name

उम्मीद है की यह मदद करेगा।

What is a enum:

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

Why to use enums:

  • enums java.lang.Enum के अंतिम उप वर्ग हैं
  • अगर एक enum एक वर्ग का सदस्य है, यह निहित स्थिर है
  • नए एंगम के साथ कभी भी उपयोग नहीं किया जा सकता, यहां तक ​​कि एन्यूम प्रकार के अंदर भी
  • नाम और मान, बस enum स्थिरांक के पाठ का उपयोग करें, जबकि toString किसी भी सामग्री प्रदान करने के लिए ओवरराइड किया जा सकता है, अगर वांछित
  • Enum स्थिरांक के लिए, बराबर और == राशि एक ही बात करने के लिए, और interchangeably उपयोग किया जा सकता है
  • enum स्थिरांक निहित सार्वजनिक स्थिर अंतिम हैं

Note:

  • enums किसी भी वर्ग का विस्तार नहीं कर सकते
  • एक enum एक सुपर वर्ग नहीं हो सकता।
  • Enum निरंतरता की उपस्थिति के क्रम को उनके "प्राकृतिक आदेश" कहा जाता है, और अन्य वस्तुओं द्वारा उपयोग किए गए आदेश को भी परिभाषित करता है: तुलना, मूल्यों का पुनरावृत्ति आदेश, एनोमसेट, एन्नसेटसेट।
  • एक गणक के निर्माणकर्ता, स्थैतिक और उदाहरण के ब्लॉकों, वेरिएबल्स और विधियां हो सकती हैं लेकिन इसमें अमूर्त विधियां नहीं हो सकतीं।

यहां अच्छे उत्तरों के अतिरिक्त, यह जानना उपयोगी है कि enums केवल अन्य क्षेत्रों की तरह हैं, जिनमें Constant क्षेत्रों और एक private constructor

उदाहरण के लिए,

 public enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } 

संकलक इस प्रकार संकलित करता है;

 class Weekday extends Enum { public static final Weekday MONDAY = new Weekday( "MONDAY", 0 ); public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 ); public static final Weekday WEDNESDAY= new Weekday( "WEDNESDAY", 2 ); public static final Weekday THURSDAY= new Weekday( "THURSDAY", 3 ); public static final Weekday FRIDAY= new Weekday( "FRIDAY", 4 ); public static final Weekday SATURDAY= new Weekday( "SATURDAY", 5 ); public static final Weekday SUNDAY= new Weekday( "SUNDAY", 6 ); private Weekday( String s, int i ) { super( s, i ); } // other methods... } 

एन्यूम Object क्लास और अमूर्त क्लास Enum सभी तरीकों को प्राप्त करता है। तो आप इसे प्रतिबिंब, मल्टीथ्रेडिंग, सिरीलेशन, तुलनीय आदि के तरीकों का उपयोग कर सकते हैं। यदि आप ऐन्यू के बजाय स्थिर स्थिरता की घोषणा करते हैं, तो आप ऐसा नहीं कर सकते। इसके अलावा, एएनयूएम का मूल्य डीएओ परत के साथ ही पारित किया जा सकता है।

यहां प्रदर्शित करने के लिए एक उदाहरण कार्यक्रम है

 public enum State { Start("1"), Wait("1"), Notify("2"), NotifyAll("3"), Run("4"), SystemInatilize("5"), VendorInatilize("6"), test, FrameworkInatilize("7"); public static State getState(String value) { return State.Wait; } private String value; State test; private State(String value) { this.value = value; } private State() { } public String getValue() { return value; } public void setCurrentState(State currentState) { test = currentState; } public boolean isNotify() { return this.equals(Notify); } } public class EnumTest { State test; public void setCurrentState(State currentState) { test = currentState; } public State getCurrentState() { return test; } public static void main(String[] args) { System.out.println(State.test); System.out.println(State.FrameworkInatilize); EnumTest test=new EnumTest(); test.setCurrentState(State.Notify); test. stateSwitch(); } public void stateSwitch() { switch (getCurrentState()) { case Notify: System.out.println("Notify"); System.out.println(test.isNotify()); break; default: break; } } } 

ENUM "एन्यूमरेटेड टाइप" के लिए खड़ा है यह एक डेटा प्रकार है जिसमें निश्चित स्थिरांक है जो आप खुद को परिभाषित करते हैं।

enum अर्थ है एन्यूम eration यानी (कई चीजें) एक करके एक करके।

एक एन्यूम एक डेटा प्रकार है जिसमें स्थिर सेट का स्थिर सेट होता है।

या

एक enum एक class तरह है, जिसमें संकलन के समय में निर्धारित निश्चित उदाहरणों के साथ होता है।

उदाहरण के लिए:

 public class EnumExample { interface SeasonInt { String seasonDuration(); } private enum Season implements SeasonInt { // except the enum constants remaining code looks same as class // enum constants are implicitly public static final we have used all caps to specify them like Constants in Java WINTER(88, "DEC - FEB"), SPRING(92, "MAR - JUN"), SUMMER(91, "JUN - AUG"), FALL(90, "SEP - NOV"); private int days; private String months; Season(int days, String months) { // note: constructor is by default private this.days = days; this.months = months; } @Override public String seasonDuration() { return this+" -> "+this.days + "days, " + this.months+" months"; } } public static void main(String[] args) { System.out.println(Season.SPRING.seasonDuration()); for (Season season : Season.values()){ System.out.println(season.seasonDuration()); } } } 

Enum के फायदे:

  • enum प्रकार सुरक्षा में सुधार
  • Enum आसानी से स्विच में इस्तेमाल किया जा सकता है
  • enum को पार किया जा सकता है
  • enum के खेतों, कन्स्ट्रक्टर और विधियां हो सकती हैं
  • Enum कई इंटरफेस को लागू कर सकता है, लेकिन किसी भी वर्ग का विस्तार नहीं कर सकता क्योंकि यह आंतरिक रूप से Enum वर्ग का विस्तार करता है

अधिक के लिए

मेरी राय में, आपके पास अब तक के सभी उत्तर मान्य हैं, लेकिन मेरे अनुभव में, मैं इसे कुछ शब्दों में व्यक्त करता हूं:

यदि आप एक पहचानकर्ता के मूल्य की वैधता की जांच करने के लिए कंपाइलर चाहते हैं तो एमानों का उपयोग करें

अन्यथा, आप हमेशा तारों के रूप में स्ट्रिंग्स का उपयोग कर सकते हैं (संभवत: आपने अपने एप्लिकेशन के लिए कुछ "सम्मेलनों" को परिभाषित किया है) और आप बहुत लचीले होंगे … लेकिन आपको अपने स्ट्रिंग्स पर टाइम्प्स के खिलाफ 100% सुरक्षा नहीं मिलेगी और आप उन्हें केवल एहसास करेंगे रनटाइम में

Enum? क्यों इस्तेमाल किया जाना चाहिए मुझे लगता है कि जब आप इसका प्रयोग करेंगे तब इसकी अधिक समझ जाएगी। मेरे पास एक ही अनुभव है

कहें कि आपने डीबी ऑपरेशन बना, हटा, संपादित और पढ़ा है

अब यदि आप ऑपरेशन के रूप में एक enum बनाते हैं

 public enum operation { create("1") delete("2") edit("3") read("4") //you may have is methods here public boolean isCreate() { return this.equals(create); } //more methods like the above can be written } 

अब, आप ऐसा कुछ घोषित कर सकते हैं

 private operation currentOperation; //and assign the value for it currentOperation=operation.create 

तो आप इसे कई मायनों में उपयोग कर सकते हैं विशिष्ट चीज़ों के लिए एन्यूम होना हमेशा अच्छा होता है क्योंकि उपरोक्त उदाहरण में डीबी ऑपरेशन को वर्तमानऑपरेशन की जांच करके नियंत्रित किया जा सकता है। शायद कोई यह कह सकता है कि इसे चर और पूर्णांक मानों के साथ पूरा किया जा सकता है .परंतु मेरा मानना ​​है कि Enum एक सुरक्षित और एक प्रोग्रामर का तरीका है।

एक अन्य चीज: मुझे लगता है कि हर प्रोग्रामर बूलियन को पसंद नहीं करता है, क्योंकि यह केवल दो मानों, दो विशिष्ट मानों को स्टोर कर सकता है। तो ऐन्यू को उसी प्रकार की सुविधाओं के बारे में सोचा जा सकता है जहां उपयोगकर्ता परिभाषित करेगा कि कितने और किस प्रकार का मूल्य यह स्टोर करेगा, बस थोड़ा अलग तरह से। 🙂

जावा आपको केवल कुछ पूर्वनिर्धारित मानों में से एक होने के लिए चर को प्रतिबंधित करने देता है – दूसरे शब्दों में, एक एन्यूमरेटेड सूची से एक मान enums का उपयोग करना आपके कोड में बग को कम करने में मदद कर सकता है। यहां एक कक्षा के बाहर के enums का एक उदाहरण है:

 enums coffeesize{BIG , HUGE , OVERWHELMING }; //This semicolon is optional. 

यह किसी coffeesize को प्रतिबंधित coffeesize है: BIG , HUGE , या OVERWHELMING एक चर के रूप में

अब तक, मुझे कभी भी उपयोग करने की आवश्यकता नहीं है। मैं उनके बारे में पढ़ रहा हूं क्योंकि वे 1.5 या संस्करण बाघ में पेश किए गए थे क्योंकि इसे दिन में वापस बुलाया गया था। उन्होंने कभी मेरे लिए 'समस्या' का हल नहीं किया जो लोग इसका इस्तेमाल करते हैं (और मैं उनमें से बहुत कुछ देखता हूं), मुझे यकीन है कि यह निश्चित रूप से किसी उद्देश्य से कार्य करता है। बस मेरी 2 राउंड

यहां बहुत सारे उत्तर दिए गए हैं, बस दो विशिष्ट लोगों को इंगित करना है:

1) Switch-case स्टेटमेंट में स्थिरांक के रूप में प्रयोग करना। स्विच केस आपको केस के लिए स्ट्रिंग ऑब्जेक्ट का उपयोग करने की अनुमति नहीं देगा। Enums काम में आते हैं अधिक: http://www.javabeat.net/2009/02/how-to-use-enum-in-switch/

2) Singleton Design Pattern कार्यान्वित करना – फिर से, बचाव के लिए आता है उपयोग, यहां: जावा में सिंगलटन के रूप में एन्यूम का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?

प्रकार सुरक्षा के लिए एमानों का उपयोग करें, यह एक भाषा विशेषता है, ताकि आप आम तौर पर प्राप्त कर सकें:

  • कंपाइलर समर्थन (तुरंत प्रकार के मुद्दों को देखें)
  • आईडीई में उपकरण समर्थन (स्विच मामले में स्वत: पूर्णता …)

Enums के तरीकों, कन्स्ट्रक्टर हो सकते हैं, आप enums के अंदर भी उपयोग कर सकते हैं और इंटरफेस के साथ enums को जोड़ सकते हैं।

इंमान के एक अच्छी तरह से परिभाषित सेट को प्रतिस्थापित करने के प्रकार के रूप में enums के बारे में सोचें (जो सी / सी ++ से 'विरासत में मिली' जावा)

प्रभावी जावा 2 संस्करण के बारे में एक संपूर्ण अध्याय पुस्तक है और अधिक विवरण में जाता है। यह स्टैकेवरफ्लो पोस्ट भी देखें

मुझे अहह हा क्षण क्या दिया गया था यह एहसास था कि: Enum के पास सार्वजनिक गणन के माध्यम से केवल एक निजी निर्माता है:

 enum RGB { RED("Red"), GREEN("Green"), BLUE("Blue"); public static final String PREFIX = "color "; public String getRGBString() { return PREFIX + color; } String color; RGB(String color) { this.color = color; } } public class HelloWorld { public static void main(String[] args) { String c = RGB.RED.getRGBString(); System.out.print("Hello " + c); } } 

मेरे लिए भविष्य में कोड को पढ़ने योग्य बनाने के लिए अगले स्निपेट में गणना का सबसे उपयुक्त aplyable केस प्रदर्शित किया गया है:

 public enum Items { MESSAGES, CHATS, CITY_ONLINE, FRIENDS, PROFILE, SETTINGS, PEOPLE_SEARCH, CREATE_CHAT } @Override public boolean onCreateOptionsMenu(Menu menuPrm) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menuPrm); View itemChooserLcl; for (int i = 0; i < menuPrm.size(); i++) { MenuItem itemLcl = menuPrm.getItem(i); itemChooserLcl = itemLcl.getActionView(); if (itemChooserLcl != null) { //here Im marking each View' tag by enume values: itemChooserLcl.setTag(Items.values()[i]); itemChooserLcl.setOnClickListener(drawerMenuListener); } } return true; } private View.OnClickListener drawerMenuListener=new View.OnClickListener() { @Override public void onClick(View v) { Items tagLcl= (Items) v.getTag(); switch (tagLcl){ case MESSAGES: ; break; case CHATS : ; break; case CITY_ONLINE : ; break; case FRIENDS : ; break; case PROFILE: ; break; case SETTINGS: ; break; case PEOPLE_SEARCH: ; break; case CREATE_CHAT: ; break; } } }; 

जैन में कई स्थिर अंतिम चर की परंपरागत परिभाषा का ऐन्यूम है, यह अत्यधिक उपयोग होता है जब आपके पास स्थिरांक का उचित निर्धारित सेट होता है

मैं enum का सबसे महत्वपूर्ण लाभ देख रहा हूँ जब आप किसी विधि को परिभाषित करते हैं जो एक निरंतर तर्क को स्वीकार करता है, इस तरह से आप विधि कॉल करने वाले को पूर्वनिर्धारित स्थिरांक के लिए मजबूर करते हैं और उन्हें यादृच्छिक निरंतर मानों को पारित करने के लिए रोकते हैं।

संदर्भ: जावा में एनोम का उपयोग कैसे करें

मेरे अनुभव में मैंने देखा है कि ऐनोम उपयोग कभी-कभी सिस्टम को बदलने में बहुत मुश्किल होता है। यदि आप डोमेन-विशिष्ट मानों के एक सेट के लिए एन्यूम का प्रयोग कर रहे हैं जो अक्सर बदलता है, और इसमें कई अन्य वर्गों और घटकों पर निर्भर होते हैं, तो आप एक एन्यूएम का उपयोग नहीं करने पर विचार करना चाह सकते हैं

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

एक बेहतर उदाहरण एक उत्पाद श्रेणी प्रकार की तरह कुछ होगा। मान लें कि आपका सॉफ्टवेयर डिपार्टमेंट स्टोर के लिए इन्वेंट्री प्रबंधित करता है बहुत सारे उत्पाद श्रेणियां हैं, और कई कारणों की वजह से श्रेणियों की यह सूची बदल सकती है। प्रबंधक एक नई उत्पाद लाइन को शेयर कर सकते हैं, अन्य उत्पाद लाइनों से छुटकारा पा सकते हैं, और समय-समय पर श्रेणियों को संभवतः पुनः संयोजित कर सकते हैं। यदि आपको अपने सभी सिस्टमों को पुनर्निर्माण और पुनर्वितरण करना है, क्योंकि प्रयोक्ता उत्पाद श्रेणी को जोड़ना चाहते हैं, तो आपने कुछ ऐसी चीज़ ली है जो सरल और तेज होनी चाहिए (श्रेणी जोड़कर) और इसे बहुत मुश्किल और धीमा बना दिया

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