==
पर इस्तेमाल किया जा सकता है enum
?
हां: enums में तंग उदाहरण नियंत्रण हैं जो आपको ==
उदाहरणों की तुलना करने के लिए उपयोग करने की अनुमति देता है । यहाँ भाषा विनिर्देश द्वारा प्रदान की गई गारंटी (मेरे द्वारा जोर):
एक एनुम प्रकार का कोई अन्य उदाहरण नहीं है, जो इसके एनम स्थिरांक द्वारा परिभाषित है।
यह स्पष्ट रूप से एक एनम प्रकार को तुरंत करने का प्रयास करने के लिए एक संकलन-समय की त्रुटि है। यह सुनिश्चित final clone
करने की विधि Enum
कि enum
स्थिरांक को कभी भी क्लोन नहीं किया जा सकता है, और क्रमांकन तंत्र द्वारा विशेष उपचार यह सुनिश्चित करता है कि डुप्लिकेट इंस्टेंसेस को कभी-कभी डीरियलाइजेशन के परिणामस्वरूप नहीं बनाया जाता है। Enum प्रकार के चिंतनशील तात्कालिकता निषिद्ध है। साथ में, ये चार चीजें सुनिश्चित करती हैं कि स्थिरांक enum
द्वारा परिभाषित लोगों से परे किसी प्रकार का कोई उदाहरण मौजूद नहीं है enum
।
क्योंकि प्रत्येक enum
स्थिरांक का केवल एक ही उदाहरण है , दो विधि संदर्भों की तुलना करते समय विधि के स्थान पर ऑपरेटर का उपयोग करने की अनुमति है यदि यह ज्ञात हो कि उनमें से कम से कम एक स्थिरांक को संदर्भित करता है==
equals
enum
। ( equals
विधि Enum
एक ऐसी final
विधि है जो केवल super.equals
अपने तर्क पर आक्रमण करती है और परिणाम लौटाती है, इस प्रकार एक पहचान तुलना का प्रदर्शन करती है।)
यह गारंटी काफी मजबूत है कि जोश बलोच ने सिफारिश की है कि यदि आप सिंगलटन पैटर्न का उपयोग करने पर जोर देते हैं, तो इसे लागू करने का सबसे अच्छा तरीका एक तत्व का उपयोग करना है enum
(देखें: प्रभावी जावा 2 संस्करण, आइटम 3: एकल के साथ सिंगलटन संपत्ति को लागू करें निजी कंस्ट्रक्टर या एक एनुम प्रकार ; सिंगलटन में थ्रेड सुरक्षा )
==
और के बीच अंतर क्या हैं equals
?
एक अनुस्मारक के रूप में, यह कहा जाना चाहिए कि आम तौर पर, ==
एक व्यवहार्य विकल्प नहीं है equals
। हालांकि, यह (जैसे कि साथ enum
) है, पर विचार करने के लिए दो महत्वपूर्ण अंतर हैं:
==
कभी नहीं फेंकता NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
संकलन समय पर अनुकूलता जाँच के अधीन है
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
==
लागू होने पर उपयोग किया जाना चाहिए?
बलोच ने विशेष रूप से उल्लेख किया है कि अपरिवर्तनीय वर्ग जिनके पास अपने उदाहरणों पर उचित नियंत्रण है, वे अपने ग्राहकों के लिए गारंटी दे सकते हैं जो ==
उपयोग करने योग्य है। enum
विशेष रूप से उदाहरण के लिए उल्लेख किया गया है।
आइटम 1: कंस्ट्रक्टरों के बजाय स्थैतिक कारखाने के तरीकों पर विचार करें
[...] यह एक अपरिवर्तनीय वर्ग को यह सुनिश्चित करने की अनुमति देता है कि कोई दो समान उदाहरण मौजूद नहीं हैं: a.equals(b)
यदि और केवल यदि a==b
। यदि कोई वर्ग यह गारंटी देता है, तो उसके ग्राहक विधि के ==
बजाय ऑपरेटर का उपयोग कर सकते हैं equals(Object)
, जिसके परिणामस्वरूप बेहतर प्रदर्शन हो सकता है। Enum प्रकार यह गारंटी प्रदान करते हैं।
संक्षेप में, का उपयोग ==
करने के लिए तर्क enum
हैं:
- यह काम करता हैं।
- यह तेज है।
- यह रन-टाइम पर अधिक सुरक्षित है।
- यह संकलन-समय पर अधिक सुरक्षित है।