| 

.NET C# Java Javascript Exception

1
Und zwar soll Gleichheit bedeuten, dass alle Felder die gleichen Werte enthalten. Gibt es da irgendwie eine Funktion dafür oder ein Framework? Denn eigentlich muss das ja rekursiv laufen.

Edit: Ich benutze Java. CRegenschein schrieb etwas zu Reflection. Gibt es dafür ein Beispiel?
News:
04.02.2011
Schnotzeck 11 1 2
8 Antworten
1
Mit Reflection ist das sicherlich möglich, falls Deine Programmiersprache das bietet.
Java und C# usw. können das wohl, aber für ein konkretes Beispiel müsstest Du noch mitteilen, in welcher Sprache das geschehen soll

Grüße
CRegenschein
04.02.2011
CRegenschein 645 2 9
frage editiert...
Schnotzeck 04.02.2011
Wie unten schon erwähnt: Entweder du verdrahtest nun hart deine Feldvergleiche mit equals (=beste performance) oder Du machst es mit Reflection. Das kann aber beliebig komplex werden.

Dort wurde sowas wohl schon mal implementiert:

http://jajatips.blogspot.com/2008/10/using-reflections-for-test-equals.html
CRegenschein 04.02.2011
1
Ausgehend, dass du den Quellcode hast, würde ich für die Klasse einen Operator überladen, der die Gleichheit oder Ungleichheit testet. Dann weißt du nämlich, welche Felder du hast und somit vergleichen musst.
Wenn du den Code nicht hast, musst du mit Reflection arbeiten, wie CRegenschein richtig sagt.
04.02.2011
tboerner 509 8
1
Das sehe ich genauso, du kannst in Java ebenfalls die equals-Methode überschreiben.
04.02.2011
Andy Stumpp 509 1 6
1
Ich würde das auch in die equals Methode integrieren. Habe aber noch einen Tipp um Programmierarbeit zu sparen. Im Apache Package commons-beanutils gibt es die Klasse org.apache.commons.beanutils.BeanComparator
Die kannst du nutzen um per Reflections API 2 Beans zu vergleichen.

Natürlich nur, wenn du Java als Programmiersprache verwendest. Ich bin mir aber sicher das es so etwas ähnliches in .Net und anderen Sprachen auch geben wird.
04.02.2011
JStauvermann 21 1
0
Würde stark empfehlen auf die Implementierung der Methode equals zu setzen, denn die Klasse selbst weiß am besten wann zwei Instanzen davon gleich sind. Zusammen mit hashCode wird diese Methode auch vom Collections-Framework verwendet.
07.02.2011
Markus Stäuble 285 7
0
Die Frage ist sehr abstrakt, sodass es schwierig ist, konkret darauf zu antworten.

Das Überschreiben der equals-Methode ist sicherlich die beste Wahl, wenn die Anzahl der zu vergleichenden Objektvariablen drei nicht überschreitet. Um diese Richtlinie einzuhalten, auch wenn es mehr Variablen gibt, die zu vergleichen sind, kann man Objekte unterschiedlichen Typs komponieren, um den Vergleich pro Typ klein zu halten.

Grundsätzlich hat man eh ein Granularitätsproblem, wenn ein Objekt einer Klasse mehr als zehn Objektvariablen besitzt, die dann auch noch die Identität darstellen. Ich kenne den Anwendungsfall nicht, aber unter der genannten Bedingung sollte das Design überdacht werden.

Die Verwendung von Apache Commons EqualsBuilder scheint nützlich. Es muss aber klar sein, was EqualsBuilder macht und ob das Verhalten in jedem Fall gewünscht ist. Ich lehne solche generischen Mechanismen für die Einbindung in ein Fachmodell ab. Generische Implementationen haben nur etwas im Fachmodell zu suchen, wenn sie Typsicherheit produzieren. Ansonsten sind diese Mechanismen Framework-Entwicklern vorrzubehalten, da diese häufig nicht wissen, mit welchen konkreten Objekten sie es zu tun haben werden.

Falls Du die equals-Methode überschreibst, ist es ebenfalls sinnvoll die hashCode-Methode zu überschreiben. Die JAVA-Richtlinien legen dies sogar fest, da in vielen Kontexten hashCode verwendet wird, um schnellen assoziativen Zugriff auf Objekte zu realisieren.

Das Überschreiben von equals und hashCode ist nicht ganz unkritisch. Deshalb halte dies sehr einfach. Zusätzlich ist zu beachten, dass die mit equals zu vergleichenden Objektvariablen immutable (unveränderbar) sind, falls die Objekte in hashCode-nutzende Mengen und Listen verarbeitet werden. Objekte, deren Identitäts-Variablen nachträglich geändert werden, werden in hashCode-nutzenden Mengen und Listen nicht wiedergefunden, was zu nicht nachvollziehbaren Seiteneffekten führen kann. Am besten ist es für die Identitätsvariablen keine Setter anzubieten, was natürlich bedeutet, dass deine Objekte KEINE Beans sein dürfen.

Hier ein Beispiel:

class A {

private String x;
private B b;

public A (String x, B b) {
this.x = x;
this.b = b;
}

@Override
public boolean equals(Object o) {
boolean equals = false;
if (o instanceof A) {
A that = (A) o;
equals = this.x.equals(that.x) && this.b.equals(that.b);
}
return equals;
}

@Override
public int hashCode() {
return this.x.hashCode() * this.b.hashCode();
}

}

public class B {

private String y;

public B (String y) {
this.y = y;
}

@Override
public boolean equals(Object o) {
boolean equals = false;
if (o instanceof B) {
B that = (B) o;
equals = this.y.equals(that.y);
}
return equals;
}

@Override
public int hashCode() {
return this.y.hashCode();
}

}


Die equals-Methoden sind nicht null-safe. Aber da wir ja nie null zurückgeben und auch nie übergeben erübrigt sich dies, denn null smells horrible...

Solltest Du doch Reflection verwenden und das Gießkannenprinzip anwenden wollen, rate ich tatsächlich zu der bewährten Implementation von Apache Commons. Lieber das, als selbst etwas zu stricken.
09.02.2011
oopexpert 455 1 8
0
Der Vollständigkeit halber: eine ähnliche Frage wurde ein paar Tage nach den Posts in diesem Thread bei stackoverflow gestellt. Die dortigen Antworten thematisieren zum einen die Performance-Unterschiede verschiedener Ansätze, zum anderen gibt es dort ein sehr schönes Beispiel, wie man eine eigene equals-Methode relativ einfach und schön zu lesen mit Hilfe von Google Guava implementieren kann.
06.04.2011
Matthias Hlawatsch 13,2k 4 9

Stelle deine Java-Frage jetzt!