使用相等運算符比較類實例的缺陷是什麼?使用相等運算符比較兩個類
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
使用相等運算符比較類實例的缺陷是什麼?使用相等運算符比較兩個類
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
沒有陷阱真的;它的行爲就像你期望的那樣,如果你期望實際的行爲:)另外,Class
對象的equals()
方法只是從Object
繼承的方法,無論如何它都使用==
運算符。
唯一令人驚訝的部分是,如果同一個類文件由兩個不同的類加載器加載,則會得到兩個單獨的類對象,它們將被比較爲false
。這是設計。
有沒有陷阱。 Class
不會覆蓋默認Object.equals
所以它是相同的語義,但實際上將是使用equals
是一個陷阱,因爲左操作數是null
將挑起一個NPE。
而這個陷阱是... – OrangeDog 2012-07-25 10:33:51
@OrangeDog ......它在答案中說了什麼。 – 2012-07-25 10:34:39
@OrangeDog他提到了陷阱,雖然不是一個很大的陷阱,但與使用'=='比較時仍然不方便。所以這是一個小陷阱。 – 2012-07-25 10:34:41
如果這些類由不同的ClassLoader
加載,那麼這些類可能來自同一個文件,但不能由同一個對象表示。在這種情況下,它們也可能有不同的行爲,因爲其中一個加載器可能已經執行了字節碼修改。
類不重寫equals並直接擴展Object,在這種情況下,equals和==是相同的。
無論如何,最好的做法是使用等於你可以。
如果您不知道==和equals之間的差異,請閱讀它。
這可能是明智的做
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz.getName().equals(rootClazz.getName());
}
或某些版本的getName()
如getSimpleName()
'getSimpleName'將在不同包中的同名命名類中斷。 – 2014-08-27 15:07:51
但是,當然,這是完全正確的,如果有涉及到兩個類加載器返回'FALSE'。 – 2012-07-25 10:33:57
這就是「這是設計」的含義。 – 2012-07-25 10:34:55