2010-04-15 17 views
13

मुझे पूर्व परिभाषित कक्षाओं की सूची के विरुद्ध कक्षा वस्तु की तुलना करना है। क्या यह == का उपयोग करना सुरक्षित है या क्या मुझे बराबर() का उपयोग करना चाहिए?कक्षा वस्तुओं की तुलना करें

if  (klass == KlassA.class) { 
} else if (klass == KlassB.class) { 
} else if (klass == KlassC.class) { 
} else { 
} 

नोट: मैं उपयोग नहीं कर सकते instanceof, मैंने किसी चीज़ की ज़रूरत नहीं है, मैं सिर्फ .class वस्तु है। मैं (गलत) इस स्थिति में एक enum की तरह इसका उपयोग करें!

उत्तर

22

java.lang.Classdoes not ओवरराइड java.lang.Object से equals विधि है, जो इस तरह कार्यान्वित किया जाता है:

public boolean equals(Object obj) { 
    return (this == obj); 
} 

तो a == ba.equals(b) रूप में ही है (सिवाय a बातिल है)।

1

यह शायद सुरक्षित है।

यदि ऑब्जेक्ट Equals विधि को ओवरराइड नहीं करता है तो यह संदर्भों के बीच तुलना करेगा। और यदि दो चर एक ही वस्तु को इंगित करते हैं, तो उनके संदर्भ मेल खाते हैं।

+0

अच्छी बात, याद किया कि, धन्यवाद! :) – reto

3

जावा अनुप्रयोगों में से अधिकांश के लिए यह सही है। हालांकि, ऑपरेटर == का उपयोग कर जावा क्लास की तुलना करना सुरक्षित है अगर दोनों वर्ग एक ही क्लासलोडर द्वारा लोड किए जाते हैं।

+3

इससे कोई फर्क नहीं पड़ता।एक ही नाम वाले दो वर्ग लेकिन विभिन्न वर्ग लोडरों द्वारा लोड किए गए एक ही पते पर नहीं होंगे और न ही वे एक ही कक्षा होंगे। तो '==' गलत होगा और यह सही होगा। यदि ओपी कक्षा के नामों की तुलना करना चाहता था जो अलग होंगे (और फिर 'klass.getName() का उपयोग करें। (Xxxx.class.getName()) ' –

2

मुझे यकीन नहीं है कि यह आपकी विशिष्ट स्थिति के लिए काम करेगा, लेकिन आप Class.isAssignableFrom(Class) आज़मा सकते हैं।

KlassA.class.isAssignableFrom(klass) 
+0

या क्योंकि प्रकार रिफ्लेक्सिव हैं तो आप klassA.isAssignableFrom (klasB) का भी उपयोग कर सकते हैं) && klassB.isAssignableFrom (klasA) समानता – Steiny

+0

@Steiny, जो समानता के लिए लगता है, समानता के लिए हम केवल वर्ग संदर्भों की तुलना कर सकते हैं। –

0

मैं कक्षा वस्तुओं और enum स्थिरांक के बीच तुलना के लिए == उपयोग करने के लिए है क्योंकि यह असंगत प्रकार के मामले में संकलन समय त्रुटियों में परिणाम है पसंद करते हैं।

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

Class<?> cls1 = Void.class; 
String cls2 = "java.lang.String"; 

if (cls1 == cls2) doSomething();  // Won't compile 

if (cls1.equals(cls2)) doSomething(); // Will compile 
0

पिछले जवाब में उल्लेख किया है, कक्षा प्रकार (या java.lang.Class वस्तुओं) की वस्तुओं की तुलना करने के लिए हम == ऑपरेटर का उपयोग करना चाहिए। हालांकि, यह थोड़ा उलझन में हो सकता है क्योंकि हमेशा == ऑपरेटर के माध्यम से वस्तुओं के बीच तुलना का परिणाम सही परिणाम नहीं दे सकता है (हम आमतौर पर बराबर() विधि का उपयोग करते हैं)। उदाहरण के लिए, इस अभिव्यक्ति का परिणाम गलत है:

new String("book") == new String("book")//false 

कारण यह है कि,

आभासी मशीन का प्रबंधन करता है प्रत्येक प्रकार के लिए एक अनूठा कक्षा वस्तु है। इसलिए, आप java.lang.Class ऑब्जेक्ट्स की तुलना करने के लिए == ऑपरेटर का उपयोग कर सकते हैं। सच में

new String("book").getClass() == new String("book").getClass()//true 

या

Class.forName("java.lang.String") == Class.forName("java.lang.String")//true 

परिणाम: Core Java for the Impatient - Page 153

इसलिए से।

+0

यह सख्ती से सच नहीं है कि प्रति वर्चुअल मशीन के दिए गए नाम के साथ केवल एक वर्ग मौजूद होगा। क्लासलोडर के बाद से क्लास ऑब्जेक्ट पहचान का एक हिस्सा है, कई लोडर जो एक ही नाम के साथ समेकित रूप से लोड किए गए वर्ग को दो वर्गों का उत्पादन करेंगे जो बराबर नहीं हैं। –

+0

सबसे पहले, आपकी टिप्पणी के लिए धन्यवाद। आपका बिंदु सही है, ऑरैक डॉक के अनुसार: "एक कक्षा है अपने पूर्ण नाम और वर्ग लोडर द्वारा निर्धारित "। जैसा कि मुझे यकीन है कि आप जानते हैं, Class.forName (...) एक क्लास पैकेज और नाम से संबंधित क्लास ऑब्जेक्ट देता है, जो कॉलर में स्थित है या वर्तमान वर्ग लोडर। चूंकि, classLoader.loadClass (className) क्लास ऑब्जेक्ट को एक विशेष क्लास लोडर में प्राप्त करने के लिए उपयोग किया जाता है। तो, वर्तमान वर्ग लोडर में हम तुलना के लिए Class.forName (...) का उपयोग कर सकते हैं। – MMKarami

+0

मैं जो कह रहा हूं वह है - आप वास्तव में एकल अभिव्यक्ति में कई 'class.forName' कॉल के परिणाम की तुलना कर सकते हैं, लेकिन यदि आप किसी वर्ग में' कक्षा 'ऑब्जेक्ट को कहीं और सहेजते हैं, तो यह हमेशा आवश्यक नहीं होगा अलग-अलग क्लासलोडिंग संदर्भों से बाद में कॉल के 'क्लास.forनाम' के परिणामों के बराबर। यह अतीत में कई सुंदर पुस्तकालयों के लिए एक समस्या थी, यही कारण है कि मुझे लगा जैसे इसका उल्लेख किया जाना चाहिए। –

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