Mam podmiot, który dziedziczy po innych. Z drugiej strony używam projektu lombok, aby zmniejszyć standardowy kod, więc umieściłem @Data
adnotację. Adnotacja @Data
z dziedziczeniem generuje następne ostrzeżenie:
Generowanie implementacji equals / hashCode, ale bez wywołania nadklasy, mimo że ta klasa nie rozszerza java.lang.Object. Jeśli jest to zamierzone, dodaj
@EqualsAndHashCode(callSuper=false)
do swojego typu.
Czy wskazane jest dodanie adnotacji, @EqualsAndHashCode (callSuper = true)
czy @EqualsAndHashCode (callSuper = false)
? Jeśli nie dodaje, Który z nich jest to callSuper=false
czy callSuper=true
?
@EqualsAndHashCode(callSuper=true)
powinno rozwiązać ostrzeżenie.źródło
@EqualsAndHashCode
rozwiązuje ostrzeżenie.Główne pierwotne pytanie brzmi:
Przyjęta odpowiedź jest w zasadzie po prostu:
Aby to rozwinąć, dokumentacja @EqualsAndHashCode zawiera solidne wskazówki dotyczące wyboru. Szczególnie to, IMHO:
Aby to nieco sprecyzować: wybierz opcję „callSuper = true”, jeśli dziedziczenie z nadklasy, która albo nie ma informacji o stanie, albo sama używa adnotacji @Data, albo ma implementacje równości / hash, które „prawidłowo radzą sobie z sytuacją” - co interpretuję jako zwracanie właściwego skrótu wartości stanu.
źródło
Jeśli chcesz porównać również członków nadklasy, użyj
@EqualsAndHashCode(callSuper=true)
. Jeśli jednak tylko chcesz porównać pól w bieżącej klasy można użyć@EqualsAndHashCode(callSuper=false)
która jest domyślną opcją.Jeśli używasz funkcji Delombok, możesz zauważyć, że różnica polega na tym, że po ustawieniu
true
tej linii jest dodawany do wygenerowanej metody równościif (!super.equals(o)) return false;
. Jeśli masz członków w nadklasie, które powinny być brane pod uwagę podczas porównywania dwóch obiektów, to aby porównać je poprawnie, musisz ustawić wartość true.źródło