vergleichen Sie zwei generische komplexe Objekte java
Meine Forderung ist für den Vergleich von zwei Objekten der gleichen unknown/generic Art.
Die Objekte sind Komplex. Sie enthalten Listen, die sich enthalten Listen.
So, meine ersten Gedanken sind zu verwenden, ein Komparator für den Vergleich von Objekten, Reflexion
entdecken Sie alle Eigenschaften der bean und einige Rekursion zu behandeln verschachtelte
listet die Objekte enthalten können.
oder, gibt es ein Dienstprogramm, das tun alle, die für mich in java?
- Wenn es 2 Objekt unterschiedlich sind, und Sie nicht wissen, Ihre Arten, nach welchen Kriterien werden Sie Sie vergleichen ?
- das war mein Erster Gedanke auch. Aber die Frage lautet "vergleichen zweier Objekte die gleiche unbekannt/generischen Typ"
- Hi, hatte nicht wirklich angenommen, dass. Lässt vermuten, dass es eine vordefinierte Liste von möglichen Typen, wie String, Integer, Date, Liste - mit gleichen. Dann kann ich verwenden instanceOf überprüfen, bevor Sie den Vergleich für jeden Typ.
- Ich glaube, dies ist bekannt als "deep vergleichen".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin momentan an einem ähnlichen problem. Ich kann bestätigen, dass die Verwendung von java-reflection können Sie vergleichen zwei Objekte der gleichen unknown/generic Art. Ich fand alles, was ich tun musste, so hier. Hier ist ein kleiner überblick, wie es zu tun:
field.get(ob1).equals(field.get(ob2)
Allerdings deutet ein Vergleich der Objekte innerhalb der Objekte ist weit schwieriger. Ich habe keine Lösung gefunden und hier ist das problem: zu vergleichen, um die Objekte mithilfe von Reflexion, benötigen Sie zwei Objekte. Ich habe noch nicht entdeckt, die ein Verfahren zum extrahieren eines Objekts aus einem Objekt unbekannten Typs. Lassen Sie mich wissen, wenn Sie nichts finden.
Wenn Sie sicherstellen können, all das verschachtelte Objekt-Baum implementiert Vergleichbar, die Sie nutzen könnten:
http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html
Können Sie Bean Utils oder direkt verwenden... Apache Commons EqualsBuilder
einen ähnlichen Lösung
BEARBEITET :
Bitte haben Sie einen Blick auf dieser Beitrag. Beim googeln fand ich auch diese BeanDiff api, die für Sie nützlich sein kann.
Ewe. Ich nehme an, man könnte Reflektion verwenden, um eine Liste der Felder, und gehen von dort aus. Sie brauchen etwas komplizierten code, um zu bestimmen, ob eine gegebene Feld ist ein einfacher oder komplexer Art, und Graben sich in die Felder, die Komplex sind, wenn Sie vergleichen.
Dies sehen , um Ihnen den Einstieg auf dem erhalten eine Liste der Felder, Ihre Namen, und Ihre Typen
Ich würde es tun, wie du schon erwähnt hast.
Disclaimer : ich bin kein JAVA-dev.
Ich glaube nicht, dass es eine saubere Art und Weise zu vergleichen, unbekannte Arten. Hier ist, was ich tun würde : deklarieren Sie ein interface, nennen wir es ComparableInterface
Machen alle Klassen, die Ihre unbekannten Objekt könnte eine Instanz dieses interface implementieren. Dann verwenden Sie es, um Sie zu vergleichen.
Andere Lösungen die ich mir denken kann wäre ein hässlicher hack :/. Auch ich denke, wenn Sie haben, zu vergleichen thinkg, die Sie nicht kennen, haben Sie ein problem in Ihrem design.