Was bringt eine get set Methode in Java? Was ist der Sinn davon?

6 Antworten

Der Sinn ist den Zugriff auf Variablen sicher zu gestalten und, wenn nötig, die Validität der Daten sicherzustellen, daher werden Variablen meist auf private Zugriff gestellt und der Zugriff nur über Methoden gestattet.

Beispielsweise wenn eine Variable nur Werte zwischen 0 und 1 haben darf, kann dies in der Set-Methode sicher gestellt werden. Die Get-Methoden haben den Sinn den Zugriff auf die richtigen Variablen zuzulassen und den auf ausschließlich interne auszulassen, außerdem können mit Get Methoden bei verschiedenen Objekten die eine gemeinsame Oberklasse haben spezifische Details intern und lokal geregelt werden ohne Unterschiede extern Bedenken zu müssen.

Sei z.B. die Oberklasse geometrische Körper und eine Methode getVolume(). Dann ist die Berechnung des Volumens für Würfel, Kugel, Pyramide etc verschieden aber die Eigenschaft einheitlich. Will man nun eine Reihe von Objekten die geometrische Körper sind vergleichen muss nicht erst die Art des Körpers, die nötigen Werte und dann die Rechnung für jeden Typ erledigt werden, sondern es genügt die besagte Methode aufzurufen.

Das Beispiel ist relativ trivial, klar, aber nehme man nun an, das von verschiedenen Programmen auf diese Objekte zugegriffen wird und die Werte sich häufiger ändern, dann ist mit den Gettern ein sicherer, kontrollierter Zugriff möglich.

class Bank {
   private int money = 1000;
   private String secret = "secret-password";

   private boolean isOwner = false;

   public void authenticate(String secret) {
      if(!secret.Equals(this.secret)) {
         this.isOwner = false;
         return;
      }

      this.isOwner = true;
   }
   
   public int getMoney() {
      if(!isOwner) {
         System.out.println("Eat shit...");
         return 0;
      }

      return this.money;
   }
   
   public void setMoney(int money) {
      if(!this.isOwner) {
         System.out.println("Eat shit...");
         return;
      }

      System.out.println((this.money - money) + " abgebucht");
      this.money = money;
   }
}

Bank bank = new Bank();

// Beispielklassen
Hacker hacker = new Hacker();
Owner owner = new Owner();

bank.authenticate(hacker.getPassword());
bank.getMoney(); // Eat shit...
bank.setMoney(); // Eat shit...

bank.authenticate(owner.getPassword());
bank.getMoney(); // 1000
bank.setMoney(100); // 900 abgebucht

Um Geschütze variablen schreiben und lesen zu können. Variablen welche die Sichtbarkeit private oder protected aufweisen

  • Man möchte eine Variable nur lesbar, aber nicht schreibbar machen, also erstellt man nur einen Getter.
  • Umgekehrter Fall: nur schreibbar, also erstellt man nur einen Setter. Allerdings kommt das nur sehr selten vor.
  • Man möchte beim Setzen oder Lesen einer Variable noch mehr tun, als sie nur zu setzen oder zu lesen. D.h. im Getter/Setter steht mehr als nur eine Zeile. So kann man z.B. überprüfen, ob der Wert, auf den die Variable gesetzt werden soll, korrekt ist. Außerdem kann man auch Umrechnungen durchführen, falls man intern in anderen Einheiten rechnet, aber nach außen hin auch andere zulassen möchte. Es können ebenfalls Methoden zur Aktualisierung aufgerufen werden (dies wird oft beim Zeichnen angewandt, wenn man die Zeichenfläche aktualisieren will, nachdem man neue Zeichenelemente hinzugefügt hat).
  • ....

Nehmen wir einfach mal folgende Klasse als Beispiel:

class Uhrzeit{
public int stunde, minute, sekunde;
public Uhrzeit(){
stunde = minute = sekunde = 0;
}
public Uhrzeit(int stunde, int minute, int sekunde){
this.stunde = stunde;
this.minute = minute;
this.sekunde = sekunde;
}
public String toString(){
return String.format("%02d:%02d:%02d", stunde, minute, sekunde);
}
}

Dann machen wir das:

...
Uhrzeit t = new Uhrzeit(12,80,200);
System.out.println(t.toString());
...

Was Kommt wohl dabei raus? Das:

12:80:200

Ganz offensichtlich keine gültige Uhrzeit...

Was machen wir also?

Wir setzen zuerst stunde, minute und sekunde auf private.

Dann bauen wir eine Getter-Methode für jedes dieser Felder, die einfach nur den aktuellen Wert zurückgibt.

Dann eine Setter-Methode für minute und sekunde, die z.B. so aufgebaut sein kann:

public void setMinute(int minute){
while(minute >= 60){
minute -= 60;
++this.stunde;
}
this.minute = minute;
}

Dann noch eine Setter-Methode für stunde, fertig.