2012-07-25 15 views
6

क्या समानता ऑपरेटर का उपयोग कक्षा उदाहरणों की तुलना में नुकसान कर रहे हैं का उपयोग कर दो वर्गों की तुलना करना?समानता ऑपरेटर

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) { 
    return clazz == rootClazz; 
} 

उत्तर

12

नहीं नुकसान वास्तव में; यह सिर्फ आप उम्मीद थी के रूप में व्यवहार, यदि आप वास्तविक व्यवहार की उम्मीद :) इसके अलावा, Class वस्तुओं के लिए equals() विधि सिर्फ Object से विरासत में मिली है, जो == ऑपरेटर वैसे भी उपयोग करता है।

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

+0

के रूप में लेकिन निश्चित रूप से, यह पूरी तरह से उचित है 'FALSE' वापस जाने के लिए अगर वहाँ दो शामिल classloaders हैं कुछ संस्करण बनाना। –

+1

"यह डिजाइन द्वारा है" क्या है इसका मतलब है। –

1

कोई नुकसान कर रहे हैं। Class डिफ़ॉल्ट Object.equals पर हावी नहीं होता तो यह एक ही अर्थ विज्ञान है, सिवाय इसके कि वहाँ वास्तव में बाईं संकार्य null जा रहा है एक एनपीई भड़काने जाएगा के बाद से equals उपयोग करने के साथ एक ख़तरा होगा।

+0

और यह pitfall है ... – OrangeDog

+0

@ OrangeDog ... जवाब में यह क्या कहता है। –

+0

@ ऑरेंजडॉग ने उन्होंने गड़बड़ी का जिक्र किया, हालांकि एक बड़ा नुकसान नहीं, यह अभी भी '==' का उपयोग करने की तुलना में एक असुविधा है। तो यह एक छोटा सा झटका है। –

3

यदि वर्ग अलग-अलग ClassLoader एस द्वारा लोड किए गए थे तो कक्षाएं उसी फ़ाइल से हो सकती हैं, लेकिन उसी ऑब्जेक्ट द्वारा प्रदर्शित नहीं होती हैं। इस स्थिति में, उनके पास अलग-अलग व्यवहार भी हो सकते हैं, क्योंकि लोडर में से एक ने बाइटकोड संशोधनों का प्रदर्शन किया हो सकता है।

0

कक्षा बराबरी पर हावी नहीं होता और सीधे वस्तु फैली हुई है, के बराबर होती है और == इस मामले में एक ही हैं।

परवाह किए बिना, सबसे अच्छा अभ्यास के बराबर जब आप कर सकते हैं का प्रयोग है।

आप == के बीच अलग नहीं जानते हैं और बराबर होती जाना इसके बारे में पढ़ा है।

-1

यह समझदार हो सकता है

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) { 
    return clazz.getName().equals(rootClazz.getName()); 
} 

या की getName(), इस तरह के getSimpleName()

+1

'getSimpleName' अलग-अलग पैकेजों में समान नामित कक्षाओं के लिए तोड़ देगा। –

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