Javaschubla.de - Java als erste Programmiersprache

OO06 eine equals-Methode für die Klasse Angestellter

Wir hatten in OO05 gesehen, dass wir mit == vergleichen, ob zwei Variablen auf dasselbe Objekt zeigen, man prüft auf "Identität". Wie bei Strings ist die equals-methode dafür zuständig, zu überprüfen, ob der Inhalt gleich ist. Diese muss man sich für seine Klassen selbst schreiben - wenn man denn überhaupt jemals die Möglichkeit benötigt, die Gleichheit zweier Objekte dieses Typs, also zweier Instanzen dieser Klasse, festzustellen. Die anderen Methoden lasse ich der Übersichtlichkeit halber mal weg.

class Angestellter
{
  String vorname;
  String nachname;
  int alter;
  int gehalt;

  Angestellter(String v, String n, int a, int g)
  {
    vorname = v;
    nachname = n;
    alter = a;
    gehalt = g;
  }

  public boolean equals(Angestellter a)
  {
    if (a.vorname.equals(vorname) && a.nachname.equals(nachname) &&
        a.alter == alter && a.gehalt == gehalt)
    {
      return true;
    }
    else
    {
      return false;
    }
  }
}

Die Strings vergleichen wir mit equals, die ints mit ==. (Bei manchen Klassen muss man beim Schreiben der equals-Methode genauer überlegen, welche Attribute man mit == und welche man mit equals vergleicht, manchmal will man auch Objekte mit == vergleichen, weil es auf deren Identität, nicht nur deren Gleichheit ankommt.)

Wir können den if-else-Ausdruck etwas verkürzen:

  public boolean equals(Angestellter a)
  {
    if (a.vorname.equals(vorname) && a.nachname.equals(nachname) &&
        a.alter == alter && a.gehalt == gehalt)
    {
      return true;
    }
    return false;
  }

Warum funktioniert das? Bei return hört die Methode bereits auf, d.h. sie kehrt zurück. Wenn also der Vergleich wahr/true ergeben hat, kommt die Methode nicht bis zu der Zeile, wo return false steht. Aber wenn er falsch/false ergeben hat, wurde return true nicht ausgeführt, der Programmfluss kommt zu der Zeile return false und gibt ordnungsgemäß false zurück.

Wir können es noch weiter verkürzen. Der ganze Ausdruck a.vorname.equals(vorname) && a.nachname.equals(nachname) && a.alter == alter && a.gehalt == gehalt ergibt ja true oder false, und wenn er true ist, wollen wir true zurück geben, wenn er false ist, wollen wir false zurück geben. Also geben wir einfach das Ergebnis des Ausdruckes zurück:

  public boolean equals(Angestellter a)
  {
    boolean ergebnis = a.vorname.equals(vorname) && a.nachname.equals(nachname) && a.alter == alter && a.gehalt == gehalt;
    return ergebnis;
  }

Und das können wir noch einfacher auch ganz ohne Variable machen:

  public boolean equals(Angestellter a)
  {
    return a.vorname.equals(vorname) && a.nachname.equals(nachname) && a.alter == alter && a.gehalt == gehalt;
  }

Das ist am Anfang vielleicht ein bisschen verwirrend, aber später wird man es immer so schreiben.

Die equals-Methode muss später noch verbessert werden, wenn die Begriff "this", "null" und "instanceof" bekannt sind.


Übung

Schreib eine Klasse Tier für das Tierarztverwaltungsprogramm. Denk dir ein paar Attribute aus. Schreib einen Konstruktor. Schreib eine equals-Methode. Schreib eine Klasse, die einige Tier-Objekte erstellt und vergleicht.


Auch in der nächsten Lektion geht es um Objektorientierung, nämlich um die Kapselung von Daten mit dem Zugriffsmodifizierer private.