Unterschied zwischen setter/getter-Methoden und verwendung von This.?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Vorteile

  • Strukturierung und Stringenz
  • Sicherheit

Nachteile

  • Lesbarkeit / die Klasse wird größer - manchmal unsinniger Ballast
  • Geschwindigkeit (praktisch nicht relevant; Compiler wandeln eh bereits um)

Wieso Getter und Setter

Getter und Setter sind Teil des objektorientierten Prinzips von Kapselung. Ich habe ein Objekt vor mir und das funktioniert. Beispielsweise eine Mikrowelle. Von außen habe ich Zugriff auf bestimmte Methoden oder Eigenschaften, doch nur für das, was ich benötige. Stell dir vor, um deine Mikrowelle wäre kein Plastikgehäuse verbaut und du würdest bei jeder Nutzung erst von jeglicher anderer Komponente des Systems abgelenkt werden. Ein Anfänger wäre überfordert, das System ist nicht mehr intuitiv bedienbar. Bei Java Swing bspw. ist es schön gemacht: Du erstellst eine Instanz JFrame z.B. und in einer IDE wie Eclipse oder NetBeans wird dir unter g und s sofort angezeigt, auf welche Eigenschaften du Zugriff hast. Du hast die Sicherheit, dass dieser Vorgang kontrolliert abläuft und das System selbst in seiner Funktion nicht negativ beeinflusst. 

Ein weiteres, konkreteres Beispiel:

class Window {
boolean dragging; int height; int width;
}

Du erstellst eine Komponente Fenster, das mit der Maus auch verschiebbar sein soll. Für die Umsetzung wirst du eine boolsche Variable benötigen, um festzustellen, wann du gerade schiebst, und wann nicht mehr. Ein möglicher Zugriff von außen wäre unschön, das System wäre manipulierbar. Außerdem ist es von außen betrachtet nicht relevant, wie das Fenster das Verschieben umsetzt. Zugriff auf Breite und Höhe sind es schon.

Die Getter und Setter ermöglichen nun noch den kontrollierten Umgang mit den vorliegenden Eigenschaften.

  • Setter: Mögliche Überprüfung, ob der zugewiesene Wert zulässig ist (eine negative Höhe und Breite bspw. sind nicht wünschenswert)
  • Setter: Reaktion auf die Zustandsänderung - z.B. für die Umsetzung des Observer-Pattern. Der Setter ändert den Wert der Eigenschaft und ruft zusätzlich eine Methode auf, die Observer darüber informiert, dass sich das Objekt gerade verändert hat
  • Getter: Vorherige Berechnungen, Typecasts, u.a. machen dein Programm übersichtlicher
  • Bei der Arbeit mit Threads können Getter und Setter das Sperren und Entsperren deines Objekts übernehmen, sodass du sicher Zustände ändern kannst

Zuletzt noch zu den Nachteilen und der Verwendung von this:

Ja, es ist nicht zu bestreiten, dass Getter und Setter auch ein Antipattern darstellen können. Habe ich bspw. ein Model, welches nur Daten speichert (z.B. Name, Alter, Adresse), macht es kaum Sinn, erst die Membervariablen zu definieren und danach nochmal Getter und Setter (außer wie gesagt, ich möchte die Werte vorher nochmal auf etwas prüfen, bspw. dass das Alter zwischen 0 und 150 liegt).

Innerhalb einer Klasse ist es jedenfalls nicht notwendig/sinnvoll, Getter und Setter zu nutzen, es sei denn, sie machen mehr als nur simples Setzen und Holen. Auf den äußeren Zugriff hat this keine Relevanz, da das Schlüsselwort nur innerhalb einer Klasse existiert und die aktuelle Referenz bezeichnet.

Setter-Methoden beschreiben eine Membervariable.
Getter-Methoden lesen den Wert einer Membervariable aus.

Die Ein- und Ausgabe erfolgt kontrolliert. Zum Beispiel können beim Beschreiben Plausibilitätsprüfungen durchgeführt werden und beim Lesen eine Formatierung vorgenommen werden.

this bezieht sich auf die aktuelle Objektinstanz.

CounterMonkey  18.08.2016, 14:07

Gewöhnlicherweise sind die Variablen der Klasse private, damit sie wie schon gesagt nur kontrolliert neu gesetzt und ausgelesen werden. Das erleichtert die Fehlersuche und -vermeidung, wenn niemand einfach so per Direktzugriff die Werte ändern kann.

In gößeren Projekten in denen verschiedene Module von verschiedenen Personen gecoded werden ist das zudem wichtig, da diese Methoden die beschriebenen Schnittstellen sind die sich nie ändern und über die man zuverlässig an die Werte kommt oder sie setzt, völlig egal ob an der Klasse selber noch gebastelt wird, was sich genau in ihr abspielt oder wie die Variablen heissen.

menyou 
Fragesteller
 18.08.2016, 14:14

Was ist denn jetzt genau der Unterschied ob Membervariable oder ob Objektinstanz?o,O

Beide beschriebenen Variablen sind doch in der Hauptklasse und können auch beide in die Methoden dieser Klasse aufgerufen werden (bitte keine Fachbegriffe-sonst versteh ich wieder nicht den Unterschied :,D)

Suboptimierer  18.08.2016, 14:25
@menyou

Eine Klasse ist so etwas wie ein Container, der Variablen und Funktionen beinhaltet. 

Wird innerhalb einer Methode, die zu einer Klasse gehört, auf die Klasse referenziert, kann man this verwenden.

Pseudocode

class a
{
 private
   int b; // b ist eine Membervariable
 public
  int getb()
  {
    return this.b; // this ist die aktuelle Instanz von a
  }
}

Für die genauen Syntax in Java stecke ich nicht tief genug im Thema. 

Suboptimierer  18.08.2016, 14:29
@menyou
//... irgendwo anders
a meina = new a(); // Instanziierung von a
Ausgabebefehl(meina.getb());

In vielen Programmiersprachen gibt es für Get- /Set-Methoden eine bestimmte Syntax, die es ihnen erlaubt, in Form einer Eigenschaft aufgerufen zu werden.

Vorteile von Gettern und Settern sind dass du Kontrolle über die Verwendung der Werte hast und sie nicht einfach überschreibst.

this ist einfach um zu betonen, dass man das Objekt meint, dessen Funtion aufgerufen wird. Das macht man häufig bei Konstruktoren und Settern, bzw. man MUSS es machen, wenn man Parametern und Variablen die gleichen namen geben will.

im folgenden Code beschreibt "a" den Parameter und this.a den aktuell gespeicherten Wert von a.

class A{
int a;
void setA(int a){
this.a=a;
}
}
menyou 
Fragesteller
 18.08.2016, 18:06

this wende ich bereits fröhlich in meinem Programm an, leider fehlt mir das beispiel, wo es sinnvoll wäre setter und getter an zu wenden. Ich habe zwar ein beispiel mit einer DB gefunden, wo allerdings im nachhinein darauf verwiesen wird, das man es mit this lösen kann... hab da irgendwie den roten faden verloren... :/

PerfectMuffin  18.08.2016, 19:05
@menyou

Getter und Setter werden vor allem bei Vererbung wichtig.

Jeder Sprung den du im Debugger siehst entspricht einen "Tick". Für Methoden gibt es ein Paar Ticks die ausgeführt werden. Wenn du aber this. verwendest, gibst du eine direkte Referenz an, dass heisst der PC kann sich direkt die Daten holen, wobei bei den Methoden noch zuerst zum Beispiel der Methodenkopf überprüft wird und verschiedene andere Sachen. An sich haben diese minimalen Unterschiede keine Auswirkung auf die Schnelligkeit einfach weil Computer heutzutage unzählige Ticks in der Sekunde schaffen so dass auch wenn man für jede Operation ein zwei Ticks mehr braucht nach milliarden Operationen immernoch keine bemerkbare Verzögerung entsteht. Von daher, theoretisch schon, praktisch nicht :)

PS: Korrigiert mich bitte wenn etwas falsch ist da ich mir nicht ganz sicher bei einzelnen Infos bin :)

menyou 
Fragesteller
 18.08.2016, 14:15

Also ist this schneller und die getter/setter methode birkt eher nachteile und ist um die eigentlich gewollte Lösung drum herum gebaue?

thomaszZz, Software Engineer bei gutefrage  18.08.2016, 14:29

Moderne Compiler werden Getter und Setter, die nicht mehr tun als eine Variable zu lesen oder speichern inlinen. D.h. der Funktionsaufruf wird durch direkte Lese-/Schreiboperationen ersetzt und der Overhead durch den Funktionsaufruf entfällt.

Siehe auch: https://de.wikipedia.org/wiki/Inline-Ersetzung