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

So kannst du Instanzen in Java Klassen zählen

Wie kannst du die Instanzen der Java Klassen zählen? Ganz einfach. Am besten ist es, wir bleiben beim Einführungsbeispiel zu den Java Klassen. Und ich wähle die Klasse „Monster“. Um es einfach zu halten, soll auch der Programmstart durch die Klasse erfolgen. Die Klasse bietet somit eine main-Methode an.

Nutze die richtigen Methoden zum Java Lernen

Java lernen Methoden

Ich lernte die Java Programmierung auf die klassische Art. Ich kaufte mir das erste Buch und los ging es. „Jetzt wirst du Java lernen“ – sagte ich zu mir. Ich war relativ schnell ziemlich frustriert, denn irgendwie fehlten mir ein paar Zusammenhänge. Kennst du das? Du hast ein Wissensfetzen und noch einen. Aber das Wichtigste. […]

So kannst du in den Java Klassen Attribute anlegen

Java Klassen Attribute

Die bisherigen Java Klassen in unserem Einführungsbeispiel besitzen noch keine Attribute. Das ändern wir und legen diese jetzt an. In diesem Beitrag erfährst du: Warum Variablen in deinen Klassen eine entscheidende Rolle spielen. Was es bedeutet eine Variable zu deklarieren. Wo du Attribute in den Java Klassen anlegen darfst und wo nicht. Wie du durch […]

So verwendest du Inkrement und Dekrement Operatoren in deinen Java Programmen

Java Operatoren

In diesem Beitrag geht es um Java Operatoren. Ich möchte dir gern zwei neue Operatoren vorstellen. Diese nennen sich Inkrement und Dekrement. Ja was heißt das? Inkrementieren bedeutet eine schrittweise Erhöhung einer Zahl. Und dementsprechend bedeutet Dekrementieren: Die schrittweise Verminderung einer Zahl. Wozu brauchst du das? Stell dir vor. Du bekommst eine Liste mit Namen […]

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

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 deine Eclipse Oberfläche anpassen

Eclipse anpassen

In diesem Beitrag möchte ich dir zwei ganz nette Features von Eclipse vorstellen. Es geht um Views und um Perspektiven. Wie du schon weißt, besteht Eclipse aus einer grafischen Oberfläche. Und in dieser Oberfläche stehen dir verschiedene Views zur Verfügung. Was ist so ein View?

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

So kannst du in drei einfachen Schritten Java Arrays dynamisch vergrößern

Java Arrays vergrößern

Es ist der 31.März 1727. Es ist ein Montag. Die Welt nimmt Abschied von einem sehr bedeutenden Weltveränderer. Seine Sichtweisen beeinflussen, heute noch, die Forschung und Entwicklung im Bereichen der Physik und Chemie. Ja selbst unser aller Leben – unsere Sicht auf die alltäglichen Dinge – wurden durch seine Denkstöße revolutioniert. Dieser große Vorreiter starb […]

Java Vererbung:
Die 3 Schablonen für deine Java Objekte

Java Vererbung Beispiel

Im letzten Beitrag habe ich dir das Java Vererbung Konzept an einem Beispiel vorgestellt. In dem Beispiel-Rollenspiel gab es Klassen zu Helden und Superhelden. Ich habe dir die Vererbungshierarchien theoretisch erläutert. Jetzt geht es ans Praktische. In diesen Beitrag lernst du: Wie du bestehende Java Klassen erweiterst Wie du Objekte aus den erweiterten Klassen erstellen […]