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 lernen von Kopf bis Fuß

Wenn du Java lernen möchtest, kannst du an meinem kostenlosen Java Kurs teilnehmen. Aber manch Einer hätte gern eine zweite Meinung. Und da bieten sich natürlich Java Bücher an. Eines dieser Java Bücher möchte ich dir jetzt vorstellen. Dieses Buch nennt sich „Java von Kopf bis Fuß“. Was kannst du von diesem Buch erwarten? Also […]

So kannst du in Java Und Verknüpfung anlegen und auswerten

Java Und

In Java stehen dir eine Menge Operatoren zur Verfügung. Einer dieser Operatoren ist der Und-Operator. Dies ist ein logischer Operator, da dieser sogenannte Wahrheitswerte mit einander verknüpft. Also…. Was erwartet dich in diesem Beitrag? Zuerst möchte ich dir die Aussagenlogik hinter dem Und-Operator zeigen. Also wann sind Aussagen wahr und wann sind diese falsch. Dann […]

So kannst du Java Methoden überladen

Java Methoden überladen

Im Mittelalter war es üblich, dass Könige oder Adlige Briefe durch ein Siegel verschlossen. Das Siegel hatte die Aufgabe den Inhalt des Briefes vor dem gewaltsamen Öffnen zu schützen. Außerdem hatte das Siegel die Aufgabe einen Eigentumsnachweis sicher zu stellen. Und jeder, welcher das Siegel des Königs sah, wusste: „Das königliche Siegel – Oh ein […]

Von Java Klassen zum Java Programm – Der Programmstart

Java Klassen ausführen

In den letzten Beiträgen hast du gelernt, wie Java Klassen erstellt werden und aufgebaut sind. In diesem Beitrag geht es um den Programmstart. Ich will dir zeigen, was nötig ist, dass du ein Java Programm ausführen kannst. Und ich zeige dir außerdem, wie du eine Startklasse in einem x-beliebigen Javaprogramm anlegst. Wie auch schon zuvor, […]

Java Binärzahl in Dezimalzahl umwandeln – So geht’s.

Java-Binärzahl-umrechnen

Erinnerst du dich? In einer der letzten Beiträge haben wir uns die Zusammenhänge zwischen dem dualen und dem dezimalen Zahlensystem angeschaut. Aber wir haben noch keine Java Binärzahl in eine Dezimalzahl verwandelt. Zumindestens nicht praktisch…. Stattdessen…. Haben wir festgestellt, dass beide Zahlensysteme im Grunde genommen sehr ähnlich sind. Beim Dezimalsystem spielt die Zahl 10, als […]

Über das kurze Leben einer lokalen Variablen

Java Variable lokal

Lass uns über die Lebensdauer einer lokalen Variablen sprechen. Warum ausgerechnet die Lebensdauer? Alle Java Variablen, unterscheiden sich in folgenden Punkten: wo diese deklariert werden können, wie du diese aufrufen kannst, welchen Bereich diese abdecken, und Ihre Lebensdauer Und eine lokale Java Variable hat eine relativ kurze Lebensdauer. Schauen wir uns zuerst Klassen- und Instanzvariablen […]

So kannst du deine Java Methoden ausführen

Java Methoden ausführen

Du hast die ersten Java Methoden erstellt. Doch wie greifst du jetzt auf diese zu? Wie kannst du diese Methoden in einer anderen Klassen aufrufen? Welcher Unterschied, hinsichtlich des Methodenaufrufes, besteht eigentlich zwischen deinen Java Methoden? Diese Fragen möchte ich gern in diesem Beitrag beantworten. Gehen wir dazu in den Garten und schauen uns Blumen […]

Java Übung 17: Char-Zeichen mit For-Schleife

Java Übung Char Zeichen For Schleife

In dieser Java Übung werden wir uns die Zeichen des Character Datentypen näher anschauen. Die einzelnen Zeichen sollen auf der Konsole ausgegeben werden. Und wie? Das ganze sollst du mit einer For Schleife machen. Erstelle deshalb eine Klasse „CharZeichen“. In dieser Klasse implementierst du dann eine Klassenmethode, namens „gibZeichen“. Und im Methodenrumpf durchläuft eine For-Schleife […]

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

Java Exklusives Oder – So nutzt du den Xor Operator

Java exklusives oder

In diesem Beitrag möchte ich dir den Xor Operator von Java vorstellen. Dieser Operator wird auch als ausschließendes oder exklusives Oder bezeichnet. Ein Beispiel: Was wilst du heute zum Mittag essen: Fleisch oder Fisch? Auf diese Frage gibt es nur eine Antwort. Es ist entweder Fisch oder Fleisch. Niemals beides. Das Eine schließt das andere […]