Es gibt zwei similiar Frage auf SO:Tief rekursive Objekte Vergleich (wieder einmal)
Is there a Java reflection utility to do a deep comparison of two objects?
Deep reflective compare equals
aber es lustig ist, keiner von ihnen gibt völlig richtige Antwort auf die Frage.
Was ich und andere Fragen Autoren wirklich wollen, ist eine Methode in irgendeiner Bibliothek, die nur erzählt zwei Objekte gleich sind gegeben oder nicht:
boolean deepEquals(Object obj1, Object obj2)
das heißt ohne jede Ausnahme zu werfen und so weiter.
apache
's EqualsBuilder
ist nicht der Weg, weil es nicht tief vergleichen.
Unitils
scheint auch schlechte Entscheidung sein, weil ihre Methode true
oder false
nicht zurückgibt; Es wird nur eine Ausnahme ausgelöst, wenn der Vergleich fehlgeschlagen ist.
Difference difference = ReflectionComparatorFactory.createRefectionComparator(new ReflectionComparatorMode[]{ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS}).getDifference(oldObject, newObject);
scheint, aber es scheint sehr hässlich, und unitils
Bibliothek völlig zu schwer für Zwecke vergleichen erforderlich: Natürlich könnte es wie folgt verwendet werden.
Darüber hinaus ist es ziemlich klar, wie man solche deepEquals
von selbst erstellen, aber es ist unwahrscheinlich, dass es nicht häufig verwendete Bibliotheken, die bereits implementiert Methode wie folgt enthält. Irgendwelche Ideen?
Rekursiver Vergleich ist nicht trivial. Sehen Sie sich die EqualsBuilder.reflectionEquals-Methode an. Hier können Sie angeben, welche Felder nicht verglichen werden sollen und wie weit Sie in der Klassenhierarchie bei Verwendung der Vererbung zu erreichen sind. Wenn Sie nun ein verschachteltes Objekt haben, das Sie auch mit Reflektion vergleichen möchten, wie können Sie dann erkennen, welche Felder ignoriert werden sollen? Wenn es Ihnen egal ist, dann ist es einfach, die 'EqualsBuilder'-Implementierung einzubinden, um das zu erreichen, was Sie brauchen. Andernfalls müssen Sie möglicherweise Anmerkungen oder eine Registrierung verwenden, um anzugeben, für welche Klasse welche Felder nicht verglichen werden sollen. – krzychu