2010-06-03 19 views
33

मैंने देखा है कि निम्नलिखित स्निपेट ...क्यों जावा एनम में बराबर (ऑब्जेक्ट) को ओवरराइड करने की अनुमति नहीं देता है?

@Override 
public boolean equals(Object otherObject) { 
    ... 
} 

... एक Enum लिए अनुमति नहीं है, के बाद से विधि equals(Object x)Enum में final के रूप में परिभाषित किया गया है। ऐसा क्यों है?

मैं किसी भी उपयोग के मामले के बारे में नहीं सोच सकता जिसके लिए एनम के लिए equals(Object) ओवरराइडिंग की आवश्यकता होगी। मैं इस व्यवहार के पीछे तर्क जानने के लिए उत्सुक हूं।

उत्तर

33

कुछ भी return this == other काउंटर अंतर्ज्ञानी होगा और the principle of least astonishment का उल्लंघन करेगा। दो enum स्थिरांक equal होने की उम्मीद है यदि केवल और यदि वे एक ही वस्तु हैं और इस व्यवहार को ओवरराइड करने की क्षमता त्रुटि प्रवण होगी।

एक ही तर्क को hashCode(), clone(), compareTo(Object), name(), ordinal(), और getDeclaringClass() लागू होता है।


JLS यह अंतिम बनाने के चुनाव के लिए प्रेरित नहीं करता है, लेकिन उल्लेख enums here के संदर्भ में बराबर होती है। स्निपेट:

Enum में विधि के बराबर होती है एक अंतिम विधि है कि केवल उसके तर्क पर super.equals invokes और परिणाम देता है, इस प्रकार एक पहचान तुलना प्रदर्शन है।

0

यह ठीक है क्योंकि जावा डिज़ाइनर Enum.equals (ऑब्जेक्ट) को ओवरराइड करने के लिए किसी भी कल्पनीय उपयोग मामले के बारे में नहीं सोच सकते थे कि उस विधि को अंतिम के रूप में घोषित किया गया है - ताकि इस तरह के ओवरराइडिंग असंभव हो।

3

enum के उदाहरणों (मानों) के बराबर होने के लिए इसका अर्थ है कि इसका एक मजबूत सहज विचार है। equals विधि को अधिभारित करने की अनुमति देने से उस धारणा का उल्लंघन हो सकता है, जिससे अप्रत्याशित व्यवहार, बग और अन्य चीजों का कारण बनता है।

0

मैं कबूल करना चाहिए enums आखिरी बात मैं में equals() ओवरराइड करना चाहते हैं कर रहे हैं।

मुझे लगता है कि कारण equals() enums में अंतिम है कि जावा enum तुलना के लिए == को प्रोत्साहित करती है, और equals() के कार्यान्वयन enums में बस इसका उपयोग करता है, इसलिए equals() ओवरराइड होने से == और equals() को अलग-अलग व्यवहार करने से रोकने के लिए अनुमति देना है, जो कि कुछ अन्य डेवलपर अपेक्षा नहीं करते हैं।

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

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