Sto provando a convalidare le routine serialize e de-serialize confrontando l'oggetto risultante con l'oggetto originale. Le routine possono serializzare classi arbitrarie e profondamente annidate e di conseguenza voglio una routine di confronto che possa essere data all'istanza originale e finale e riflettere in modo riflessivo ogni tipo di valore e confrontare i valori e immergersi iterativamente in tipi di riferimento per confrontare i valori.Confronto Deep Reflective uguale a
Ho provato l'Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2)
ma questo non sembra fare un confronto molto profondo, si confronta semplicemente i tipi di riferimento per l'uguaglianza, piuttosto che le immersioni più in profondità nel loro:
Il codice seguente illustra il mio problema. La prima chiamata a reflectionEquals
restituisce true ma la seconda restituisce false.
Esiste una routine di libreria che chiunque potrebbe consigliare?
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);
}
Se la riflessione equivale al confronto dei riferimenti, ha un bug. Dovrebbe fare di più. – DwB
@DwB Sospetto che l'intento del codice sia quello di consentire di implementare in modo riflessivo equals() in una classe specifica. Questo è diverso da ciò che voglio, che è quello di riflettere su due istanze di oggetti. In questo contesto non è un bug ma piuttosto una delusione! –
Ho perso una mezza giornata, di questo debole comportamento non documentato di EqualsBuilder. Se il campo di un oggetto passato è un non primitivo, la builde rjust chiama object.equals(). Molto deludente e inutile. – AlexWien