Was sind Setter und Getter? Warum brauche ich sie? Was ist ein gutes Beispiel dafür, dass sie effektiv genutzt werden? Was ist der Sinn eines Setter und Getter?
Aktualisierung: Kann ich bitte einige Codebeispiele bekommen?
Ein Getter ist eine Methode, die den Wert einer Eigenschaft erhält. Ein Setter ist eine Methode, die den Wert einer Eigenschaft festlegt. Es gibt einige Streitpunkte über ihre Wirksamkeit, aber die Punkte sind im Allgemeinen:
zur Vollständigkeit der Kapselung
um eine konsistente Schnittstelle zu erhalten, falls sich interne Details ändern sollten
Nützlicher ist es, wenn Sie etwas Logik zum Abrufen oder Einstellen hinzufügen müssen, wie zum Beispiel einen Wert zu validieren, bevor Sie ihn schreiben.
Ein Getter / Setter wird verwendet, um ein privates Feld vor der Werbung zu verbergen (Sie können den direkten Zugriff auf ein Feld vermeiden).
Mit dem Getter können Sie einen bereitgestellten Wert überprüfen, bevor Sie ihn in Ihrem internen Feld verwenden. Mit dem Setter können Sie beispielsweise ein anderes Format anwenden oder den Schreibzugriff beschränken (z. B. auf abgeleitete Klassen).
Eine nützliche Anwendung eines Getter kann eine Art von Lazy Loading sein: Das Hintergrundfeld (das private Feld, das vom Getter verborgen ist) wird auf Null initialisiert. Wenn Sie den Getter bitten, den Wert zurückzugeben, wird er auf Null prüfen und den Wert mit einer zeitaufwendigeren Methode laden. Dies geschieht nur beim ersten Aufruf, später liefert der Getter immer den bereits geladenen Wert.
Getters und Setter können Sie steuern, wie auf Datenelemente eines Objekts zugegriffen werden kann oder geändert werden kann.
Wenn Sie dagegen Ihre Datenmitglieder direkt dem Benutzer des Objekts zur Verfügung stellen, kann der Benutzer sie nach Belieben ändern, und das Objekt würde nicht einmal wissen, dass sie geändert wurden.
Möchten Sie nicht, dass Personen ein Datenelement lesen? Machen Sie das Datenelement privat und schreiben Sie kein Getter, das den Wert zurückgibt. Möchten Sie nicht, dass Benutzer ein Datenelement ändern? Machen Sie den Datenmember privat und schreiben Sie keinen Setter für ihn. Möchten Sie die Bandbreite der zulässigen Werte kontrollieren? Setze das in den Setzer.
Eine Frage, die sich daraus ergeben könnte, ist, dass die Verwendung einer Methode anstelle eines direkten Feldzugriffs die Leistung beeinträchtigen könnte.
Die Antwort ist nicht wirklich, da Compiler Code optimieren, so dass, wenn Ihre Methode nur return field;
ausführt, wobei field
das Feld in Ihrer Klasse ist, das Sie mit dem Setter / Getter verstecken, wird es direkt auf das Feld zugreifen. So erhalten Sie in den meisten Fällen die gleiche Leistung, wobei Sie gleichzeitig die Möglichkeit haben, später zu ändern, was set / get-Methoden tun.
Effektive Java-Programmierung von Joshua Block ist ein großartiges Buch mit Tipps, wie man guten Code schreibt, und erklärt auch warum. Warum Setter / Getter verwenden, ist einer der Hinweise.
Hinweis: Möglicherweise stellen Sie fest, dass in einigen Büchern / Dokumentationsfeldern, die einen Setter / Getter darstellen und nicht direkt zugänglich sind, "Eigenschaften" anstelle von Feldern genannt werden. Z.B. In C # können Sie sogar angeben, dass ein Feld eine Eigenschaft ist, und Sie müssen set / get nicht mehr definieren (nette Funktion, denke ich).
öffentliche Accessoren (Getter und Setter) machen manchmal Sinn. (Ich ärgere mich, dass ich nicht nur die Membervariable einer Klasse, sondern auch die 2 meist bedeutungslosen Accessor-Methoden dokumentieren muss.)
Es hilft normalerweise nicht bei der Kapselung, außer in Fällen, die von Jason S. erwähnt werden.
Ein Java-Beispiel für ein Char, das aus einer Datenbank geladen wurde, aber als boolescher Wert dargestellt werden sollte
%Vor%Tags und Links oop