# Korrekte Implementierung einer equals Methode



## gberisha1212 (4. Jan 2013)

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


```
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.


----------



## Gast2 (4. Jan 2013)

Probiers aus... 

Hinweis: Die Signatur der equals Methode ist falsch.


----------



## gberisha1212 (4. Jan 2013)

EikeB hat gesagt.:


> Probiers aus...
> 
> Hinweis: Die Signatur der equals Methode ist falsch.



warum ist sie falsch ?


----------



## Gast2 (4. Jan 2013)

Weil die equals Methode aus Object so ausschaut:


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


----------



## fastjack (4. Jan 2013)

```
public boolean equals(Object other) {
```


----------



## Firephoenix (4. Jan 2013)

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

```
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ß


----------



## gberisha1212 (4. Jan 2013)

Firephoenix hat gesagt.:


> 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).
> ...



Tausend Dank!

Gruß


----------



## Marco13 (4. Jan 2013)

Schau ggf. auch mal in AngelikaLanger.com - Implementing the equals() Method - Part 1 - Angelika Langer Training/Consulting (ja, es sind mehrere Teile, und der zweite ist nochmal genauso lang  )


----------

