Jakie są pułapki porównujące wystąpienia klas za pomocą operatora równości?Porównanie dwóch klas za pomocą operatora równości
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
Jakie są pułapki porównujące wystąpienia klas za pomocą operatora równości?Porównanie dwóch klas za pomocą operatora równości
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
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.
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.
I ta pułapka jest ... – OrangeDog
@OrangeDog ... co mówi w odpowiedzi. –
@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. –
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.
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.
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()
'getSimpleName' złamie dla identycznie nazwanych klas w różnych pakietach. –
Ale, oczywiście, że jest w pełni właściwe, aby powrócić 'FALSE jeśli istnieją dwie classloaders zaangażowane. –
To, co oznacza "jest z założenia", ma sugerować. –