2012-07-25 16 views

Odpowiedz

12

Nie pułapek naprawdę; zachowuje się dokładnie tak, jak można się spodziewać, jeśli spodziewasz się właściwego zachowania :) Poza tym, obiekt equals() dla obiektów Class jest tylko odziedziczony z Object, który mimo to używa operatora ==.

Jedyną zaskakującą częścią jest to, że ten sam plik klasy jest ładowany przez dwa różne ładowniki klasy, otrzymasz dwa oddzielne obiekty klasy, które będą porównywane jako false. Jest to zgodne z projektem.

+0

Ale, oczywiście, że jest w pełni właściwe, aby powrócić 'FALSE jeśli istnieją dwie classloaders zaangażowane. –

+1

To, co oznacza "jest z założenia", ma sugerować. –

1

Nie ma żadnych pułapek. Class nie przesłonić domyślne Object.equals więc te same semantyki, tyle że tam faktycznie byłoby być pułapka z użyciem equals od lewego argumentu będącego null będzie sprowokować NPE.

+0

I ta pułapka jest ... – OrangeDog

+0

@OrangeDog ... co mówi w odpowiedzi. –

+0

@OrangeDog wspomniał o pułapce, choć nie jest to wielka pułapka, wciąż jest to niewygodne w porównaniu do używania '=='. Jest to więc mała pułapka. –

3

Jeśli klasy zostały załadowane przez różne ClassLoader s, wówczas klasy mogą pochodzić z tego samego pliku, ale nie są reprezentowane przez ten sam obiekt. W tej sytuacji mogą również mieć inne zachowanie, ponieważ jeden z modułów ładujących mógł wykonać modyfikacje kodu bajtowego.

0

Klasa nie zastępuje równości i rozszerza Obiekt bezpośrednio, równy i == są w tym przypadku takie same.

Bez względu na to, najlepszą praktyką jest używanie równań, kiedy tylko możesz.

Jeśli nie wiesz, że różnica między == i równymi, przeczytaj o tym.

-1

Być może rozsądniej zrobić

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

lub jakąś wersję getName() takich jak getSimpleName()

+1

'getSimpleName' złamie dla identycznie nazwanych klas w różnych pakietach. –

Powiązane problemy