Getter & Setter
und Access Modifier

Video

Mit dem Laden des Videos akzeptierst du die Datenschutzerklärung von YouTube. Wenn du die Menge an Daten reduzieren möchtest, die YouTube von dir sammelt, solltest du dich vorher aus deinem YouTube-Account ausloggen, das Speichern von Cookies für das Google-Ads-Programm deaktivieren und/oder Cookies im Browser blockieren.

YouTube immer automatisch laden
Inhaltsverzeichnis
Als Text lesen

Stell dir vor du entwickelst zusammen mit deinen Kollegen einen Online-Shop, in dem unter anderem mit Nutzer-Adressen hantiert wird. Dafür schreibst du folgende Klasse:

class Address {
String street;
int number;
int zipCode;
String city;
Address(String street, int number, int zipCode, String city) {
this.street = street;
this.number = number;
this.zipCode = zipCode;
this.city = city;
}
String createAddressString() {
return street + " " + number + ", " + zipCode + " " + city;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Beispielsweise kann in einem Objekt der Klasse Address die Adresse "Arcisstraße 21, 80333 München" gespeichert werden.

Dein Kollege verwendet deine Klasse an anderer Stelle in eurem Projekt, um darin auf Attribute wie z.B. street zuzugreifen. Er baut also Abhängigkeiten zu deiner Implementierung auf.

Nachdem euer Online-Shop ein voller Erfolg ist fällt dir auf, dass du nicht bedacht hast, dass es auch internationale Kunden gibt die keine deutsche Adresse besitzen. Beispielsweise die Adresse "240 W 55th St, New York, NY 10019" lässt sich mit deiner Implementierung nicht so wirklich gut speichern. Also veränderst du kurzerhand deinen Code:

class Address {
String firstLine;
String secondLine;
// Erster Konstruktor
Address(String firstLine, String secondLine) {
this.firstLine = firstLine;
this.secondLine = secondLine;
}
// Zweiter Konstruktor
Address(String street, int number, int zipCode, String city) {
firstLine = street + " " + number;
secondLine = zipCode + " " + city;
}
String createAddressString() {
return firstLine + ", " + secondLine;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Mit dieser Implementierung können nun sowohl internationale (Konstruktor 1) als auch speziell deutsche Adressen (Konstruktor 2) gespeichert werden. Die Ausgabe der Methode createAddressString ist für deutsche Adressen immer noch genau die gleiche wie zuvor.

Allerdings hast du mit dieser Änderung komplett die Funktionalität des Programmteils deines Kollegens zerstört. Dieser hat sich darauf verlassen, dass er auf das street Attribut zugreifen kann, welches jetzt nicht mehr existiert. Das ist sehr blöd. Noch blöder sieht sowas aus, wenn dein Code beispielsweise bereits in einer Programmbibliothek veröffentlicht wurde und von anderen Entwicklern verwendet wird, zu denen du keinen Kontakt hast.

Die Lösung

Trenne grundsätzlich Schnittstelle von Implementierung!

In dem Beispiel hätte es gereicht, wenn dein Kollege nur Zugriff auf die Methode createAddressString gehabt hätte. Du hättest es also irgendwie schaffen müssen, deinen Kollegen davon abzuhalten, Abhängigkeiten zu Details deiner Implementierung aufzubauen, und stattdessen nur über die Schnittstelle createAddressString zu gehen. Überraschung, in Java geht das!

Mit Access Modifiers lässt sich festlegen, welche Programm-Teile nach außen hin sichtbar sind. Zwei davon lauten:

  • public: Das betroffene Element ist von überall aus sichtbar
  • private: Das betroffene Element ist nur innerhalb der eigenen Klasse sichtbar

Im UML Klassendiagramm markiert man private Felder mit einem -, und public Felder mit einem +.

Eine deutlich bessere Implementierung wäre also von Anfang an gewesen:

// Die Klasse an sich ist überall sichtbar
public class Address {
// Die Attribute sind nur innerhalb der Klasse sichtbar
private String street;
private int number;
private int zipCode;
private String city;
// Der Konstruktor ist überall sichtbar
public Address(String street, int number, int zipCode, String city) {
this.street = street;
this.number = number;
this.zi pCode = zipCode;
this.city = city;
}
// Einzige Schnittstelle um von außen die Informationen der Attribute zu bekommen
public String createAddressString() {
return street + " " + number + ", " + zipCode + " " + city;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Hättest du nun deine Implementierung ändern wollen, wäre dies kein Problem mehr gewesen. Die private Modifier garantieren, dass es keinen direkten Zugriff auf die jeweiligen Objektattribute von außerhalb der Klasse geben kann. Da du darauf achtest, die Funktionalität nach außen hin nicht zu verändern, gibt es keine Probleme für andere Entwickler.

Wenn du weder public noch private verwendest, wird in Java standardmäßig der Package Modifier verwendet. Dieser verhält sich für uns erst einmal ähnlich wie public. Es ist jedoch best practice, für Klassen, Objektattribute, Konstruktoren, und Methoden explizit anzugeben, ob diese public sichtbar sein sollen oder nicht.

Was, wenn jetzt aber doch ein Attribut nach außen sichbar sein soll?

Du möchtest ein Attribut für andere Klassen public zur Verfügung stellen, aber trotzdem die Macht darüber behalten, eventuell Änderungen an deiner Implementierung vorzunehmen. Genau dafür gibt es Getter & Setter.

Getter & Setter sind Methoden, die ein private Objektattribut nach außen hin lesbar bzw. modifizierbar machen. Für das Attribut

private String name;
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

könnte ein Getter und ein Setter so aussehen:

// Getter
public String getName() {
return name;
}
// Setter
public void setName(String name) {
this.name = name; // Erinnerung: this.name bezieht sich auf das Objektattribut
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Über den Getter lässt sich name auslesen, ohne direkten Zugriff auf das Attribut zu benötigen. Über den Setter kann name durch einen neuen Wert ersetzt werden.

Falls nun die Implementierung geändert wird, gibt es keine Abhängigkeiten zu name, die Probleme bereiten. Lediglich die Getter und Setter müssen so angepasst werden, dass die Funktionalität nach wie vor gegeben ist.

Für einen Musik-Streaming-Dienst wird eine Datenbank aus Songs angelegt. Deine Aufgabe ist es, eine Klasse Song zu erstellen, deren Instanzen jeweils Informationen über ein bestimmtes Lied enthalten.

a) Erstelle die Klasse Song mit den folgenden Attributen:

java_song_uml_class_diagram.svg
  • String title: Der Titel des Songs
  • String artist: Der Interpret des Songs
  • String album: Das Album des Songs
  • int year: Das Veröffentlichungsjahr des Songs
  • String[] genres: Die Genres, zu denen der Song passt
  • double duration: Die Dauer des Songs in Sekunden
  • int streamCount: Die Anzahl, wie oft dieser Song bereits abgespielt wurde

b) Füge einen Konstruktor hinzu, der alle Attribute entgegen nimmt und setzt. Ausnahme: streamCount soll nicht übergeben werden, sondern mit 0 initialisiert werden.

c) Implementiere anschließend für alle Attribute Getter und Setter

Online Editor

Mit dem Laden des Online Editors akzeptierst du die Datenschutzerklärung von JDoodle, einem Produkt der Nutpan pty Ltd (Australien). JDoodle verwendet die Tools reCAPTCHA und Google Analytics, wodurch Daten an Google übertragen werden können. Ich habe leider keinen Einfluss auf diesen Prozess. Du kannst Google Analytics über ein Browserplugin deaktivieren.

Online Editor immer automatisch laden

Durch Verwendung von Getter und Setter Methoden würde es nun nichts ausmachen, wenn beispielsweise das duration Attribut plötzlich nicht mehr als double, sondern als String gespeichert werden sollte. Es müssten lediglich Getter und Setter für dieses eine Attribut so angepasst werden, dass die Funktionalität bestehen bleibt. (z.B. durch Umwandlung von einer Dauer 123.0 in "2:03" und umgekehrt.)

Häufige Fehlerquellen
  • public vor class vergessen
  • public und private vertauscht
  • error: constructor Song in class Song cannot be applied to given types: Dein Konstruktor soll nur die ersten 6 Attribute in der richtigen Reihenfolge übergeben bekommen
  • Rechtschreibfehler irgendwo in Getter & Setter
Lösungsvorschlag
public class Song {
private String title;
private String artist;
private String album;
private int year;
private String[] genres;
private double duration;
private int streamCount;
public Song(String title, String artist, String album, int year,
String[] genres, double duration) {
this.title = title;
this.artist = artist;
this.album = album;
this.year = year;
this.genres = genres;
this.duration = duration;
streamCount = 0; // (Optional, weil int sowieso standardmäßig 0 ist)
}
public static void main(String[] args) {
Song[] songs = {
new Song("Sweet Home Alabama", "Lynyrd Skynyrd", "Second Helping", 1974, new String[] {"Folk", "Rock"}, 274.0),
new Song("Bangarang", "Skrillex", "Bangarang", 2011, new String[] {"Dubstep", "House", "Brostep"}, 215.0),
new Song("Nachbeben", "Alligatoah", "Nachbeben", 2022, new String[] {"Hip-Hop", "Rap"}, 255.0)
};
// Beispiel Song wählen
Song song = songs[0];
// streamCount 10 mal inkrementieren
for (int i = 0; i < 10; i++) {
song.setStreamCount(song.getStreamCount() + 1);
System.out.println(song.getTitle() + " wurde " + song.getStreamCount() + " mal gehört.");
}
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dir gefällt meine Arbeit?

Unterstütze Mich
AllgemeinSocialRechtliches
HomeInstagramDatenschutz
ÜberYouTubeImpressum
TikTok
Ko-fi

Made with love by a former noob.

© 2022-2024 Timo Friedl