Korrekte Implementierung einer equals Methode

G

gberisha1212

Gast
Hallo,
Ich bin Anfänger in java, und brauch gerade Hilfe

Java:
public class Something {
private int attribute;
public boolean equals(Something other) {
if (other == null) { return false; }
if (other == this) { return true; }
if (other.attribute == this.attribute) { return true; }
return false;
}
}

Welche funktionalen Probleme werden auftreten, wenn ich den obigen Code benutzen würde?

Danke im Voraus.
 
G

Gast2

Gast
Weil die equals Methode aus Object so ausschaut:

Java:
public boolean equals (Object o)
Mit einem @Override über der Methode macht einen der Compiler darauf sogar aufmerksam :)
 
F

Firephoenix

Gast
Hier sieht man schön die entstehenden Probleme einer solchen equals-Implementierung:
Java:
public class Something {
	private int attribute;

	public Something(int attribute) {
		this.attribute = attribute;
	}

	public boolean equals(Something other) {
		if (other == null) {
			return false;
		}
		if (other == this) {
			return true;
		}
		if (other.attribute == this.attribute) {
			return true;
		}
		return false;
	}

	public static void main(String[] args) {
		Something s1 = new Something(42);
		Something s1a = new Something(42);
		Object s1a_2 = s1a;
		Object s1b = new Something(42);
		Something s2 = new Something(33);

		// Erster kommentierter Wert: sind die Objekte gleich
		// Zweiter Wert: Ausgabe der equals-Methode (sollte identisch zum
		// erwarteten Wert sein)
		System.out.println(s1.equals(s1a)); // true -> true
		System.out.println(s1a.equals(s1)); // true -> true
		System.out.println("---");
		System.out.println(s2.equals(s1)); // false -> false
		System.out.println(s1.equals(s2)); // false -> false
		System.out.println("---");
		System.out.println(s1a.equals(s1a_2)); // true -> true
		System.out.println(s1a_2.equals(s1a)); // true -> true
		System.out.println("---");
		System.out.println(s1b.equals(s1a)); // true -> false
		System.out.println(s1a.equals(s1b)); // true -> false
	}
}

Solange man die Objekte typsicher eingibt passt alles, sogar der Aufruf mit dem gleichen Objekt als Object funktioniert (da dann die equals-Methode von Object aufgerufen wird, die bei gleichen Instanzen true zurückliefert).
Sobald du aber 2 semantisch gleiche Objekte hast welche unterschiedliche Objekte sind, und du übergibst diese nicht als Basistyp, sondern z.b. als Object, dann wird nicht deine Methode aufgerufen, sondern die von java.lang.Object, und diese kennt dein Attribut nicht.

Daher: equals() immer als "boolean equals(Object other)" implementieren und immer mit @Override Annotieren. Dann benötigt man zwar casts und instanceof-Abfragen, vermeided aber obige Fehler.

Gruß
 
G

gberisha1212

Gast
Hier sieht man schön die entstehenden Probleme einer solchen equals-Implementierung:
----

Solange man die Objekte typsicher eingibt passt alles, sogar der Aufruf mit dem gleichen Objekt als Object funktioniert (da dann die equals-Methode von Object aufgerufen wird, die bei gleichen Instanzen true zurückliefert).
Sobald du aber 2 semantisch gleiche Objekte hast welche unterschiedliche Objekte sind, und du übergibst diese nicht als Basistyp, sondern z.b. als Object, dann wird nicht deine Methode aufgerufen, sondern die von java.lang.Object, und diese kennt dein Attribut nicht.

Daher: equals() immer als "boolean equals(Object other)" implementieren und immer mit @Override Annotieren. Dann benötigt man zwar casts und instanceof-Abfragen, vermeided aber obige Fehler.

Gruß

Tausend Dank!

Gruß
 

Neue Themen


Oben