Skip to main content

So nutzt du getter und setter Methoden bei der Java Programmierung

In diesem Artikel möchte ich dir zeigen, wie du Instanzvariablen innerhalb der Java Klasse schützt.
Und den Zugriff nur noch indirekt über getter und setter Methoden anbietest.

Stell dir vor.

Du hast ein Programm zur Lagerverwaltung geschrieben.
Dieses Programm dient Möbelhäusern dazu, ihre Bestände zu verwalten.
Und das Programm erwartet vom Nutzer gewisse Eingaben zu den einzelnen Möbeln.

Sobald ein Tisch oder Stuhl aufgenommen wird, werden Größe, Farbe usw. festgelegt.

Das ganze könnte in etwa so aussehen.

Die Möbel Klasse

public class Moebel {
int moebelGroesse;//Größe in Zentimeter
String moebelArt;//Art des Möbelstückes
String moebelFarbe;//Farbe des Möbelstückes
}


Die Klasse Lagerverwaltung Programm

public class LagerverwaltungProgramm{


public static void main (String [] args) {
Moebel stuhl = new Moebel();//Konstruktor zum Erstellen eines Stuhles
Moebel tisch = new Moebel();//Konstruktor zum Erstellen eines Tisches


stuhl.moebelArt="Stuhl";//Wertzuweisung über die Punktnotation
tisch.moebelArt="Tisch";
}
}

Jetzt kannst du über den Konstruktor sämtliche Stühle und Tische aufnehmen.

Du weist ihnen bei Programmstart eine Größe zu und schon ist das Möbelstück in deiner Verwaltung.

Was ist aber, wenn der Nutzer eine negative Zahl für die Größe eingibt?

Passiert nicht…

Oh doch.
Muss keine Absicht sein. Manchmal hat man einfach zu schnelle Finger.

Die Klasse Lagerverwaltung Programm

public class LagerverwaltungProgramm{


public static void main (String [] args) {
Moebel stuhl = new Moebel();//Konstruktor zum Erstellen eines Stuhles
Moebel tisch = new Moebel();//Konstruktor zum Erstellen eines Tisches


stuhl.moebelArt="Stuhl";//Wertzuweisung über die Punktnotation
tisch.moebelArt="Tisch";
tisch.moebelGroesse=-200;//eine negativer Wert ist eigentlich unmöglich
}
}

Eine Größe von -200 ist doch eigentlich nicht möglich.

Dennoch würde das Programm diesen Wert einfach so entgegen nehmen.

Und das ist blöd.

Das wollen wir jetzt ändern.

In diesem Beitrag möchte ich dir zeigen, wie du deine Instanzvariablen nach außen schützt.
Ich werde dir außerdem zeigen, wie du schlechte Nutzereingaben abfängst und überprüfen kannst.

Das ganze Prinzip nennt sich Datenkapselung.

Und die Datenkapselung ist ein zentraler Bestandteil der Java Programmierung.

So schützt du deine Instanzvariablen nach außen.

Es ist eigentlich ganz einfach.

Du musst lediglich vor deine Variablen das Keyword private schreiben.

Private ist einer von vier Access Modifiers.
Dieser bewirkt dass Variablen oder Methoden nicht verfügbar sind.

Verfügbar – was heißt das?
Du kannst diese Methoden oder Variablen in anderen Klassen nicht verwenden.
Diese sind dann nicht sichtbar für andere Klassen.

Und so könnte der Code jetzt aussehen.

Die Möbel Klasse

public class Moebel {
private int moebelGroesse;//Zugriff von außen nicht möglich
String moebelArt;//Zugriff von außen weiterhin möglich
String moebelFarbe;//Farbe des Möbelstückes - Zugriff von außen möglich
}

In diesem Fall wäre der Zugriff auf die Größe nicht mehr außerhalb der Klasse verfügbar.
Die Farbe und die Möbelart wären es dennoch.

Generell solltest du den Zugriff auf alle Instanzvariablen verbieten.
Setze also immer alle Instanzvariablen auf private und beschränke den Zugriff.

Jetzt besteht ein Problem.
Versuche doch einmal in der Klasse Lagerverwaltung einem Möbelstück eine Eigenschaft zu zuweisen.

Das geht jetzt nicht mehr so einfach.
Und das ist auch gut so.

Aber…
Wenn du von außen nicht mehr an die Instanzvariablen herankommst-
Wie kannst du dann zum Programmstart dem Möbelstück eine Eigenschaft zuweisen?

So geht’s.
Du baust Methoden ein, welche dem Möbelstück die Eigenschaften zuweisen.

Das hat folgenden Vorteil:
Du kannst die Nutzereingaben durch eine Programmlogik überprüfen lassen.
Somit fängst du utopische Möbelstücke und auch utopische Größeneingaben ab.

Besser oder?
Du benötigst also:

  • eine Methode zum Überprüfen und zum Zuweisen einer Instanzvariablen
  • und eine Methode, welche den Wert dann zurückgibt.

Und wie geht’s?
Um den Wert einer Variable zu überschreiben, brauchst du eine sogenannte setter-Methode.
Und so sieht der Code jetzt aus.

Die Möbel Klasse

public class Moebel {
private int moebelGroesse;//Zugriff von außen nicht möglich
private String moebelArt;//kein Zugriff möglich
private String moebelFarbe;//in der Lagerverwaltung kein Zugriff


//setter zur Instanzvariable moebelGroesse
public void setMoebelGroesse(int neueMoebelGroesse){
}
}

Der Setter ist immer öffentlich.
Das erkennst du am Java Keyword public.
Durch das Keyword public kannst du die setter Methode auch in allen anderen Klassen aufrufen.

Und das soll ja schließlich auch möglich sein.
Du willst den Wert der Variablen, genau über diese Methode, in einer anderen Klassen zuweisen.

Der Name des setters sollte immer so gewählt werden, dass dieser einen Rückschluss auf die Variable gibt.
Deshalb setzt sich der Name immer aus dem Wort set und den Namen der Instanzvariablen zusammen.

Die Setter Methode erwartet immer einen Parameter.
Und dieser Parameter ist eine lokale Variable.

Die Instanzvariable bekommt dann den Wert des Parameters zugewiesen.

Vom Prinzip gehst du hier genauso vor, wie beim Anlegen der Konstruktoren.

Und genau wie bei Konstruktoren, findet im Rumpf der Setter Methode die Zuweisung statt.
Der Wert der Instanzvariable wird durch den Wert der lokalen Variable überschrieben.

Die Möbel Klasse

public class Moebel {
private int moebelGroesse;//Zugriff von außen nicht möglich
private String moebelArt;//kein Zugriff möglich
private String moebelFarbe;//in der Lagerverwaltung kein Zugriff


//setter zur Instanzvariable moebelGroesse
public void setMoebelGroesse(int neueMoebelGroesse){
moebelGroesse=neueMoebelGroesse;//Zuweisung im Methodenrumpf
}
}

Aber nicht nur das.
Du kannst eine Logik einbauen, welche die Nutzereingabe überprüft.

Die Möbel Klasse

public class Moebel {
private int moebelGroesse;//Zugriff von außen nicht möglich
private String moebelArt;//kein Zugriff möglich
private String moebelFarbe;//in der Lagerverwaltung kein Zugriff


//setter zur Instanzvariable moebelGroesse
public void setMoebelGroesse(int neueMoebelGroesse){
if (neueMoebelGroesse>0){
moebelGroesse=neueMoebelGroesse;
System.out.println("Ein neues Möbelstück wurde aufgenommen. Die Größe beträgt:"+moebelGroesse);
}
else{
System.out.println("Eingabe muss größer Null sein.");
System.exit(1);
}
}
}

Was passiert im Methodenrumpf?
Die Methode prüft den Wert des Parameters.
Wenn dieser größer als Null ist, erfolgt die Zuweisung.
Zur Überprüfung wird eine Konsolenausgabe ausgegeben.

Ist dieser kleiner oder gleich Null.
Erfolgt eine Fehlermeldung (Wert muss größer Null sein).
Das Programm bricht außerdem ab.

Lass es uns ausprobieren.
Erzeuge ein Möbelstück in der Lagerwaltung und weise diesem über den Setter eine Größe zu.

So sieht der Code aus.

Die Klasse Lagerverwaltung Programm

public class LagerverwaltungProgramm{


public static void main (String [] args) {
Moebel stuhl = new Moebel();//Konstruktor zum Erstellen eines Stuhles


stuhl.setMoebelGroesse(200);//Zuweisung erfolgt über die setter Methode
}
}

Funktioniert?

Gib doch einmal den Parameter -200 ein.
Und ….
Jetzt erfolgt die Fehlermeldung auf der Konsole.

Passt, oder?

Warum void als Rückgabewert der setter-Methode?
Void besagt, dass diese Methode keinen Rückgabewert zurückgibt.

Der Setter braucht keinen Wert zurückgeben.
Der Setter soll nur die Nutzereingabe prüfen, feststellen ob diese in Ordnung ist und dann den Wert der Instanzvariable zuweisen.

Mit dem Setter hast du jetzt eine Schreibmethode implementiert.

Jetzt möchtest du den Wert einer Instanzvariable auch außerhalb nutzen.
Du brauchst somit noch eine Lesemethode.

Und diese Methode nennt man getter.
Die getter Methode ist ebenfalls öffentlich.
Das erkennst du wieder am Keyword public.

Die Möbel Klasse

public class Moebel {
private int moebelGroesse;//Zugriff von außen nicht möglich
private String moebelArt;//kein Zugriff möglich
private String moebelFarbe;//in der Lagerverwaltung kein Zugriff


//setter zur Instanzvariable moebelGroesse
public void setMoebelGroesse(int neueMoebelGroesse){
if (neueMoebelGroesse>0){
moebelGroesse=neueMoebelGroesse;
System.out.println("Ein neues Möbelstück wurde aufgenommen. Die Größe beträgt:"+moebelGroesse);
}
else{
System.out.println("Eingabe muss größer Null sein.");
System.exit(1);
}
}
//getter zur Instanzvariable moebelGroesse
public int getMoebelGroesse (){
return moebelGroesse;
}
}

Die getter Methode hat als Rückgabetyp immer den Datentyp der Instanzvariablen.
Schließlich soll sie den Wert lesen und diesen zurückgeben.

Dann folgt der Name.
Der Name folgt wieder einer Konvention und setzt sich aus dem Wort get und dem Namen der Instanzvariablen zusammen.

Sie ist immer parameterlos, da sie nichts mit der Instanzvariable macht, außer sie zurückzugeben.

Im Methodenrumpf stehen immer die Returnanweisung und die Variable, welche zurückgegeben wird.

Jede Methode, welche einen Rückgabewert erwartet (nicht void ist), muss diese return Anweisung haben.

Weiterhin wichtig:
Bei return bricht die Methode ab. Der Programmablauf springt dann aus der Methode heraus.
Somit muss die letzte Anweisung immer die return Anweisung sein.

Lass uns unser Programm einmal ausprobieren.
Als erstes versuchen wir einmal einen Stuhl zu erstellen.
Und diesem Stuhl weisen wir jetzt die Instanzvariable zu.

Und dann lassen wir uns den Wert über den getter zurückgeben.
Probiere es selbst aus und schau was passiert.

Die Klasse Lagerverwaltung Programm

public class LagerverwaltungProgramm{


public static void main (String [] args) {
Moebel stuhl = new Moebel();//Konstruktor zum Erstellen eines Stuhles


stuhl.setMoebelGroesse(200);
System.out.println(stuhl.getMoebelGroesse());
}
}

Du siehst, dass du keinen Zugriff mehr auf die Instanzvariablen bekommst.
Das ist gut so.

Also rufst du die setter Methode auf und weist den Wert jetzt zu.
Über die getter bekommst du die Werte zurück und kannst diese in die Konsolenausgabe einbauen.

Zusammenfassung:
Ein wesentlicher Bestandteil der objektorientierten Programmierung ist die Datenkapselung.

Durch Datenkapselung ist es möglich, Eigenschaften der Objekte zu schützen.
Dieser Schutz verläuft in vier Schritten:

  • Durch den Access Modifier private verbietest du den externen Zugriff auf Instanzvariablen.
  • Durch eine sogenannte setter Methode gestattest du einen indirekten Zugriff auf die Variablen.
  • Implementiere eine Programmlogik innerhalb des setters, welche den Wert erst prüft und dann zuweist.
  • Durch die getter Methode kannst du dir den Wert der Instanzvariable dennoch zurückgeben lassen.
  • Deine Instanzvariablen sind somit geschützt. Dennoch bietet dein Java Programm einen indirekten Zugriff an.