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 21 – Bestimme die Anzahl der Tage

Java Übung Tage

In dieser Java Übung möchte ich, dass du eine Methode schreibst, welche zwei Zahlen entgegennimmt. Und zwar soll die erste Zahl das Jahr sein. Die zweite Zahl soll eine Monatsangabe (1-12) repräsentieren. Was soll die Methode dann machen? Die Methode soll dir die Anzahl der Tage des jeweiligen Monats zurückgeben. Achte auf Schaltjahre.

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.

Overriding und Vererbung – So lassen sich Java Methoden überschreiben

Java Methoden überschreiben

In Deutschland entstehen jeden Tag tolle Geschichten. So wie diese hier…. Die größte Turmuhr der Welt, die Makkah Clock, steht in Saudi – Arabien. Und zwar direkt in Mekka. Hier ein paar Eckdaten zur Uhr: Höhe des Turmes 601 m. Das Ziffernblatt der Turmuhr hat einen Durchmesser von 43 Meter Die Länge des Minutenzeigers beträgt […]

Java Duales Zahlensystem – Binäre Zahlen in Java umwandeln

Java Dual System

Das duale Zahlensystem hat viele Bezeichnungen. Oft wird auch es Dualsystem oder Binärsystem genannt. Es besteht aber immer aus 2 Zahlen. Man verwendet oft die Zahlen 0 und 1. Es können aber auch sämtliche anderen Zahlenpaare sein. Zum Beispiel 7 und 175 sind für sich genommen, auch ein normales Zahlenpaar und somit ein Dualsystem. Mit […]

Die mathematischen Grundlagen des Dezimalsystems für Java Programmierer

Java Dezimalsystem Mathematik Programmierer

Bei der Java Programmierung benötigst du Kenntnisse über das Dezimalsystem. Allein schon für die technische Umsetzung beim Runden einer Zahl. Oder du möchtest den Kehrwert bzw. den Umkehrwert einer Zahl im Programm bestimmen lassen. Aber auch für das Herausfinden des Stellenwertes – also wieviel Stellen hat eine Zahl – benötigst du das Grundwissen des Dezimalsystems. […]

Lassen wir Java rechnen – Die Rechenoperationen für Variablen

Java rechnen

Ich liebe Mathe. In der Biographie „Der Mann, der die Zahlen liebte“, stellt Paul Hoffmann das Mathematikgenie Paul Erdös vor. Erdös war eines der größten Genies des 20 Jahrhunderts. Er arbeitete mit zahlreichen Wissenschaftlern zusammen und verfasste durchschnittlich mehr Publikationen im Jahr, als andere Mathematiker im ganzen Leben. Da Erdös sich mit sehr vielen Theoremen […]

Die vier verschiedenen Zahlensysteme in der Java Programmierung

Java Zahlensysteme

Java Zahlensysteme – Was soll das? In sämtlichen Programmiersprachen werden Zahlen in Variablen abgespeichert. Wenn du dir die einzelnen primitiven Datentypen in Java einmal anschaust – wirst du feststellen – dass die Masse der Datentypen Zahlen annehmen und speichern können. Zahlen und die Mathematik dahinter spielen in der Programmierung eine sehr große Rolle. Ganz am […]

So unterstützen dich Java Vererbungstabellen beim Entwurf

Java Vererbungstabellen

Bei der Java Vererbung gibt es zwei Klassenarten bzw. -stufen. Die Superklassen, welche einen allgemeinen Typen darstellen Und die spezielleren Unterklassen, welche die Superklasse um bestimmte Funktionen erweitern. Jetzt ist dieses ganze „Der-erbt-von-dem-Konzept“ mitunter sehr schwierig darzustellen. Zum Beispiel in einem Werkzeugkoffer. In einem Werkzeugkoffer befinden sich sämtliche Werkzeuge, von Säge bis Bohrmaschine. Wie machst […]

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 […]