Próbuję sprawdzić poprawność serializacji i dekretyzacji procedur, porównując wynikowy obiekt z oryginalnym obiektem. Procedury mogą szeregować dowolne i głęboko zagnieżdżone klasy, dlatego też potrzebuję procedury porównawczej, która może otrzymać oryginalną i ostatnią instancję i odzwierciedlać każdy typ wartości oraz porównywać wartości i iteracyjnie nurkować w typach referencyjnych w celu porównania wartości.Głębokie odblaskowe porównanie jest równe
Próbowałem Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2)
ale to nie wydaje się zrobić bardzo głębokie porównania, to po prostu porównuje typy referencyjne dla równości niż nurkowanie w głąb nich:
Poniższy kod ilustruje mój problem. Pierwsze wywołanie do reflectionEquals
zwraca wartość true, ale druga zwraca wartość false.
Czy istnieje procedura biblioteki, którą ktoś mógłby polecić?
class dummy {
dummy2 nestedClass;
}
class dummy2 {
int intVal;
}
@Test
public void testRefEqu() {
dummy inst1 = new dummy();
inst1.nestedClass = new dummy2();
inst1.nestedClass.intVal = 2;
dummy inst2 = new dummy();
inst2.nestedClass = new dummy2();
inst2.nestedClass.intVal = 2;
boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, inst2.nestedClass);
isEqual = EqualsBuilder.reflectionEquals(inst1, inst2);
}
Jeśli odbicie jest równe porównywaniu odniesień, oznacza to błąd. Powinno to zrobić więcej. – DwB
@DwB Podejrzewam, że intencją kodu jest umożliwienie refleksyjnego zaimplementowania equals() w określonej klasie. Różni się to od tego, co chcę, co ma odzwierciedlać dwie instancje obiektu. W tym kontekście nie jest to błąd, ale raczej rozczarowanie! –
Straciłem pół dnia tego słabego nieudokumentowanego zachowania EqualsBuilder. Jeśli pole przekazanego obiektu jest nie-prymitywne, to build-torelease wywołuje object.equals(). Bardzo rozczarowujące i bezużyteczne. – AlexWien