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.

Ähnliche Beiträge

Java Übung 24 – So kannst du Kommazahlen runden

Java Übung runden

In dieser Java Übung möchte ich mit dir Zahlen runden. Ich bitte dich deshalb: Erstelle eine Klasse „RundenUebung“. Lege dann eine statische Methode rundeZahl() an. Diese erwartet zwei Parameter. Parameter 1 ist die Kommazahl, welche gerundet werden soll. Als zweiten Parameter wird eine ganze Zahl übergeben, welche die Nachkommastelle – bis auf welche letztlich gerundet […]

Java Objekte leben auf dem Heap

Java-Objekte-Heap

Java hat eine interne Speicherverwaltung. Eigentlich ist es nicht nur eine. Es sind mehrere.   Uns interessieren nur zwei. Methoden und lokale Variablen werden auf dem Stack verwaltet. Und die Speicherverwaltung für Java Objekte und den Instanzvariablen findet auf dem Heap statt.   Ja wieso braucht Java eigentlich zwei Speichersysteme?   Es ist ganz einfach. […]

So legst du Utility Klassen in Java an

Java Utility Klassen

Utility Java Klassen – was ist das? Man nennt diese auch Hilfsklassen von Java. Diese Utility Klassen sind Java Klassen, welche lediglich Methoden und Konstanten anbieten. Am Beispiel: Die Klasse Math ist so eine klassische Utility Klasse. Wozu braucht man solche Klassen? Diese Klassen sind so etwas wie ein Werkzeugkoffer für jedes Java Programm. Hier […]

So kannst du ein Java Programm starten und Argumente übergeben

Um ein Java Programm starten zu können, benötigst du immer die main-Methode. Das Programm startet immer genau an dieser Stelle. Alle lokalen Variablen, welche du in der Main Methode anlegst, kannst du dann im Programm nutzen. Auch alle Methoden, welche du innerhalb des Methodenrumpfes der main-Methode aufrust, werden ausgeführt. Was ist aber vor der main-Methode. […]

So verwendest du die Java Codeblöcke zur Automatisierung

Java Codeblöcke

In diesem Beitrag geht es um den Einsatz von Java Codeblöcken oder Initialisierungsblöcken. Viele Wege führen nach Rom. Oder Alle Wege führen nach Rom. Heißt es in einem alten Sprichwort. Und so ähnlich ist es bei der Java Programmierung. In diesem Beitrag möchte ich dir einen weiteren Weg vorstellen, wie du Variablen eines Java Objektes […]

So nutzt du die While Schleife in deinem Java Programm

Java While Schleife

Manchmal ist es wichtig, Dinge einmal öfter zu tun. Bei der Java Programmierung kann es schonmal sein, dass du einen Code mehrfach ausführen lassen musst. Zum Beispiel die Zahlen eins bis zehn. Ein Java Programm, welches die Zahlen eins bis zehn wiedergibt. Na wie wäre das? Der Java Code dazu würde so aussehen: public class […]

Das Java Leben ist einfacher mit For-Schleife

Java For Schleife Aufbau

In einem anderen Artikeln habe ich bereits über Schleifen in Java gesprochen. In diesem Artikel möchte ich dir eine ganz besondere Schleife vorstellen. Warum ist diese so toll? Sie hat einen integrierten Schleifenzähler. Die Schleife zählt also bei jedem Durchlauf automatisch mit. Aber dazu gleich mehr…. Lass uns einmal so eine For Schleife anlegen.

So kannst du Eclipse installieren

Eclipse installieren

Das Schöne an Eclipse ist, es läuft auf sämtlichen Betriebssystemen. Eclipse wird einfach auf der Webseite des Herstellers herunter geladen und kann dann installiert werden. Dabei stehen dir verschiedene Versionen zur Verfügung.

So kannst du Werte aus zwei oder mehreren Java Arrays verrechnen.

Java Arrays verrechnen

Wie kann man Werte aus zwei oder mehreren Java Arrays miteinander verrechnen? Zum Beispiel: Du möchtest alle Werte des ersten Arrays mit allen Werten des zweiten Arrays addieren Oder du möchtest die Summe aus beiden Arrays wissen und erst dann diese miteinander addieren. Was erwartet dich in diesem Beitrag? Zuerst werde ich dir zeigen, wie […]