ci sono due domanda simile su SO:ricorsiva profonda oggetti di confronto (ancora una volta)
Is there a Java reflection utility to do a deep comparison of two objects?
Deep reflective compare equals
ma, è divertente, nessuno di loro dà risposta pienamente corretta alla domanda.
quello che io e gli autori di altre domande vuole veramente, è un metodo in qualche libreria che basta dire sono dati due oggetti uguali o no:
boolean deepEquals(Object obj1, Object obj2)
cioè senza lanciare alcuna eccezione e così via.
apache
''s non è il modo, perché non confronta in profondità.
Unitils
sembra essere una decisione sbagliata, perché il suo metodo non restituisce true
o false
; getta solo un'eccezione se il confronto è fallito. Certo, potrebbe essere utilizzato in questo modo:
Difference difference = ReflectionComparatorFactory.createRefectionComparator(new ReflectionComparatorMode[]{ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS}).getDifference(oldObject, newObject);
ma sembra molto brutto, e unitils
biblioteca sembra del tutto ad essere troppo difficile per confrontare richiesto scopi.
Inoltre, è abbastanza chiaro come creare tale deepEquals
da solo, ma è improbabile che non ci siano librerie usate più comuni che contengono un metodo già implementato come questo. Qualche idea?
Il confronto ricorsivo non è banale. Osserva il metodo 'EqualsBuilder.reflectionEquals' - ti consente di specificare quali campi non devono essere confrontati e in che misura raggiungere l'albero gerarchico delle classi quando si utilizza l'ereditarietà. Ora se hai un oggetto nidificato che vuoi anche confrontare usando il reflection, come puoi dire quali campi ignorare? Se non ti interessa, allora è semplice implementare l'implementazione di 'EqualsBuilder' per ottenere ciò che ti serve. Altrimenti potrebbe essere necessario utilizzare annotazioni o un registro per indicare per quale classe quali campi non confrontare. – krzychu