Home > Informatik > Stufe EF > Folge 3: Fallunterscheidungen

3.2 Setter- und Getter-Methoden

class Person - Getter/Setter - Fallunterscheidungen - if-else-Bedingungen - switch-Anweisung

Schritt 5 - Setter- und Getter-Methoden

In diesem zweiten Abschnitt der Folge 3 wollen wir sogenannte Setter- und Getter-Methoden kennenlernen. Das sind zwei wichtige Typen von Methoden, die Ihnen in der Java-Programmierung immer wieder begegnen werden. Statt langweiliger Erklärungen machen wir einfach mal ...

⇒ Speichern Sie Ihr Projekt unter einem neuen Namen ab, um Ihren bisherigen Arbeitsstand zu sichern. Ergänzen Sie den Quelltext der Klasse Person dann folgendermaßen:

public class Person
{
    private String name, vorname;
    private int alter;
    private double gewicht, groesse;

    public Person(String name, String vorname, int alter)
    {
        this.name    = name;
        this.vorname = vorname;
        this.alter   = alter;
        this.gewicht =  78.3; // kg  (Durchschnitt in Deutschland)
        this.groesse = 173.0; // cm  (Durchschnitt in Deutschland)
    }
    
    public void setGewicht(double gewicht)
    {
       this.gewicht = gewicht;
    }
    
    public void setGroesse(double groesse)
    {
       this.groesse = groesse;
    }    
    
    public double getGewicht()
    {
       return gewicht;
    }
    
    public double getGroesse()
    {
       return groesse;
    }    

    public void anzeigen()
    {
        System.out.println("Name   : " + name);
        System.out.println("Vorname: " + vorname);
        System.out.println("Alter  : " + alter);
        System.out.println("Gewicht: " + getGewicht());
        System.out.println("Größe  : " + getGroesse());
    }
}

Sie können sich diesen Quelltext zwar leicht über die Zwischenablage kopieren, aber der Lerneffekt ist größer, wenn Sie die neuen Codezeilen durch simples Abtippen in den alten Quelltext übertragen.

Der Quelltext wurde gegenüber der letzten Version um zwei Setter-Methoden und zwei Getter-Methoden ergänzt.

Setter-Methoden

Bei Setter-Methoden handelt es sich um manipulierende Methoden, die genau eine Instanzvariable verändern. Sie beginnen in der Regel mit dem Präfix "set", gefolgt vom Namen des zu verändernden Attributs, hier also setGroesse() und setGewicht().

Eine Setter-Methode darf strenggenommen nur das eine Attribut verändern. Allerdings sollte eine gute Setter-Methode vorher eine Validierung durchführen, das heißt, den übergebenen Parameterwert überprüfen. In diesem Teil der Folge 3 werden wir das später noch ergänzen.

Getter-Methoden

Die Getter-Methoden sind des Gegenteil von Setter-Methoden. Sie dienen dazu, den Wert eines Attributs zurückzuliefern. Die Getter-Methode getGewicht() beispielsweise liefert den aktuellen Wert der Instanzvariablen gewicht als double-Zahl zurück.

Da eine Getter-Methode einen Wert zurückliefert, müssen wir bei der Deklaration angeben, welchen Datentyp dieser Wert hat. Der Getter getGewicht() ("Getter" ist eine übliche Ausdrucksweise für Getter-Methoden) liefert beispielsweise eine double-Zahl zurück, bei der Deklaration

public double getGewicht()

legen wir diesen Datentyp fest.

Das Schlüsselwort private

Dieses Schlüsselwort vor den Instanzvariablen setzt das Konzept der Datenkapselung um. Als private gekennzeichnete Instanzvariablen können nur innerhalb derselben Klasse verändert werden. In gut aufgebauten Klassen geschieht dies meist über Setter-Methoden oder im Konstruktor.

Umgekehrt können die Werte solcher Variablen nur mithilfe von Getter-Methoden ausgelesen werden. Ein Direktzugriff auf solche Instanzvariablen ist weder lesend noch schreibend möglich.

Eine solche Datenkapselung (im Englischen auch als information hiding bezeichnet) soll die Instanzvariablen vor unkontrollierten Veränderungen schützen und gleichzeitig verhindern, dass der Aufrufer der Klasse Kenntnis von internen Implementierungsdetails erlangt.

Getter in der println()-Anweisung

Wie die Zeile

System.out.println("Gewicht: " + getGewicht());

zeigt, kann auch der println()-Befehl auf Getter-Methoden zugreifen. Man hätte hier natürlich auch einfach schreiben können

System.out.println("Gewicht: " + gewicht);

...aber dieses Beispiel soll Ihnen den Umgang mit Getter-Methoden demonstrieren. Später werden wir Getter auch aus anderen Methoden heraus aufrufen.

Schritt 6 - Eine Testklasse

Wenn wir in BlueJ ein Objekt der Klasse Person anlegen, müssen wir jedes Mal zwei Zeichenketten (Name, Vorname) sowie eine ganze Zahl (Alter) eingeben. Wollen wir zwei, drei oder noch mehr solcher Objekte anlegen, müssen wir diese Eingaben entsprechend oft wiederholen. Auf Dauer ist dieses Vorgehen recht lästig.

Eine selbst geschriebene Testklasse kann uns diese Arbeit abnehmen. Betrachten Sie dazu den folgenden Quelltext:

public class TestePerson
{
   Person karl, emma;

   public TestePerson()
   {
      karl = new Person("Meier", "Karl", 15);
      emma = new Person("Schulze", "Emma", 16);

      karl.setGewicht(89.4);
      karl.setGroesse(184.3);
      emma.setGewicht(67.8);
      emma.setGroesse(178.6);

      anzeigen();
   }

   public void anzeigen()
   {
      karl.anzeigen();
      System.out.println();
      emma.anzeigen();
   }
}

Hier gibt es nun einiges zu erklären.

Quelltext-Erklärung

Instanzvariablen

Die Klasse TestePerson enthält zwei Instanzvariablen karl und emma vom Typ Person. Über diese beiden Objekte können wir nun die Methoden der Klasse Person auf Herz und Nieren testen.

Konstruktor

Der Konstruktor initialisiert die beiden Objekte karl und emma, indem jeweils der Konstruktor der Klasse Person aufgerufen wird. Dabei werden die drei erforderlichen Parameter übergeben:

karl = new Person("Meier", "Karl", 15);

emma = new Person("Schulze", "Emma", 16);

Mit diesen beiden Objekten können wir nun arbeiten.

Zunächst werden die Setter-Methoden setGewicht(...) und setGroesse(...) getestet. Anschließend wird die Methode anzeigen() aufgerufen. Diese Methode wird von der Klasse TestePerson selbst zur Verfügung gestellt und gehört daher nicht zur Klasse Person.

Die Methode anzeigen()

In dieser Methode kommt das Prinzip der Delegation zur Anwendung. Die Methode TestePerson.anzeigen() führt selbst fast keine Arbeit aus, sondern ruft lediglich die anzeigen()-Methoden der beiden Objekte karl und emma auf. Sie delegiert die eigentliche Arbeit also an diese beiden Objekte. Nur der Befehl System.out.println() wird direkt ausgeführt, damit zwischen den Ausgaben der beiden Personen eine Leerzeile erscheint.

Der Testvorgang

⇒ Erstellen Sie nun ein Objekt der Klasse TestePerson.

Beim Erzeugen des Objekts wird der Konstruktor von TestePerson automatisch ausgeführt. Dieser erzeugt zunächst die beiden Testobjekte karl und emma, setzt anschließend deren Gewicht und Größe und ruft schließlich die Methode TestePerson.anzeigen() auf. Diese delegiert die Ausgabe an die beiden Person.anzeigen()-Methoden.

Sobald Sie also ein Objekt der Klasse TestePerson erzeugt haben, erscheint in der Konsole folgende Ausgabe:

Name   : Meier
Vorname: Karl
Alter  : 15
Gewicht: 89.4
Größe  : 184.3

Name   : Schulze
Vorname: Emma
Alter  : 16
Gewicht: 67.8
Größe  : 178.6

Das zehnmalige Eintippen von Zeichenketten und Zahlen ist durch dieses Vorgehen also überflüssig geworden.

Schritt 7 - Berechnende Getter-Methoden

Wir wollen das Programm nun um eine sondierende Methode erweitern, die das Idealgewicht der Person als Ergebnis zurückgibt. Die Formel zur Berechnung des Idealgewichts ist recht einfach: Körpergröße (in cm) minus 100, davon werden anschließend noch einmal 10 % abgezogen:

Idealgewicht = (Körpergröße - 100) * 0,9

Es gibt nun zwei Möglichkeiten, eine entsprechende sondierende Methode zu schreiben. Hier der erste Weg:

public double getIdealgewicht()
{
   double ideal;

   ideal = (groesse-100)*0.9;
   return ideal;
}

Hier wird zunächst eine lokale Variable ideal zum Speichern des Idealgewichts angelegt. In der nächsten Zeile wird das Idealgewicht berechnet und in dieser Variablen gespeichert. Anschließend gibt der return-Befehl den Wert von ideal als Ergebnis der Methode zurück und beendet gleichzeitig die Ausführung der Methode.

Einfacher geht es so:

public double getIdealgewicht()
{
   return (groesse-100)*0.9;
}

Diese Version der Methode getIdealgewicht() leistet genau das Gleiche wie die erste, ist aber deutlich kürzer. Der return-Befehl gibt direkt das Ergebnis der Berechnung zurück und beendet anschließend die Methode. Eine lokale Variable als Zwischenspeicher ist hier nicht erforderlich.

Aufgabe 3.2-1

Begründen Sie, warum die Methode getIdealgewicht() keine normale Getter-Methode ist.

Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich)

Übung 3.2-2

Schreiben Sie eine Methode getDifferenz(), welche die Differenz zwischen dem tatsächlichen Gewicht und dem Idealgewicht berechnet und als Ergebnis zurückliefert.

Fallbeispiele:

  • Gewicht = 75,3 kg, Idealgewicht = 72,3 kg, Rückgabewert = 3,0
  • Gewicht = 70,3 kg, Idealgewicht = 72,3 kg, Rückgabewert = -2,0

Ergänzen Sie anschließend die Methode anzeigen(), sodass auch diese Differenz ausgegeben wird.

Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich)

Seitenanfang -
Weiter mit der Folge 3.3 - Fallunterscheidungen...