@ yegor256 Ich verstehe Ihre Hund & Ball-Analogie und unterstütze sie sogar, aber was ist, wenn ein Objekt "lebender Organismus" den gelegentlichen primitiven Wert speichert, z. B. eine ID? Was ist, wenn Sie einen Schritt über die einfache Zuweisung hinausgehen möchten, aber keine neue Klasse schreiben möchten, um nur primitive Werte zu verarbeiten?
Jacksonkr
Antworten:
127
Tutorial ist dafür nicht wirklich erforderlich. Informieren Sie sich über die Kapselung
privateString myField;//"private" means access to this is restrictedpublicString getMyField(){//include validation, logic, logging or whatever you like herereturnthis.myField;}publicvoid setMyField(String value){//include more logicthis.myField = value;}
Getter ist also nur eine Methode, um ein privates Feld abzurufen, und Setter setzt ein neues Feld. danke für die ausgezeichnete Erklärung durch Code
Ajsie
1
Könnten Sie einen Parameter an einen Getter übergeben?
Ajsie
2
noname: Nein und nein. Getter ist eine Möglichkeit, einen Wert abzurufen, aber den in einem Feld enthaltenen Wert NICHT verfügbar zu machen. Wenn Sie ihn aufrufen someObj.getTime().setHour(5), sollte dies keinen Einfluss auf someObjden internen Status haben. Auch Setter und Getter (Accessoren und Mutatoren nach ihrem schickeren Namen) haben eine sehr strenge Methodensignatur, was bedeutet, dass Getter keine Parameter hat. Methoden im Allgemeinen sollten sowieso nur eines tun.
Esko
4
@noname: Wenn einfache Dinge komplexe / große / abstrakte Namen erhalten, haben Sie ein sogenanntes "Entwurfsmuster" .... Und dies ist ein Beispiel für das gerade erfundene Rekursivkonzept-Erklärungsmuster ;-)
Namespaceform
3
@qed: Das thisSchlüsselwort ist optional, es sei denn, es liegt ein Konflikt mit etwas vor, das einen spezifischeren Bereich hat. In dem von Ihnen angegebenen Beispiel verfügt der erstellte Setter über einen einzelnen Parameter, dessen Name mit dem Feldnamen übereinstimmt. Daher this.fieldName = fieldNamewird verwendet, um zu unterscheiden, dass das Feld zugewiesen wird, und nicht, wie der Parameter sich selbst zugewiesen wird, wie fieldName = fieldnamedies erreicht werden würde. Im Getter besteht kein solcher Konflikt.
Paul Creasey
39
In Java sind Getter und Setter ganz normale Funktionen. Das einzige, was sie zu Gettern oder Setzern macht, ist die Konvention. Ein Getter für foo heißt getFoo und der Setter heißt setFoo. Im Falle eines Booleschen Werts heißt der Getter isFoo. Sie müssen auch eine spezifische Deklaration haben, wie in diesem Beispiel eines Getters und Setters für 'name' gezeigt:
Der Grund für die Verwendung von Gettern und Setzern, anstatt Ihre Mitglieder öffentlich zu machen, besteht darin, dass es möglich ist, die Implementierung zu ändern, ohne die Schnittstelle zu ändern. Viele Werkzeuge und Toolkits, die Reflexion zum Untersuchen von Objekten verwenden, akzeptieren nur Objekte mit Getter und Setter. JavaBeans müssen beispielsweise Getter und Setter sowie einige andere Anforderungen haben.
Leere ist hier eigentlich notwendig. Wenn Sie es nicht haben, erhalten Sie:error: invalid method declaration; return type required
Dan
3
Leere ist hier nicht erforderlich
Shashi Kiran
2
@JasonHartley: Ein Konstruktor hat keinen Rückgabetyp.
Wassimans
@Mark Byers Der Konstruktor wird also zum Initialisieren der Instanz verwendet, und der Setter wird zum Ändern eines bestimmten Attributs verwendet. Ist das richtig?
Carloswm85
12
classClock{String time;void setTime (String t){
time = t;}String getTime(){return time;}}classClockTestDrive{publicstaticvoid main (String[] args){Clock c =newClock;
c.setTime("12345")String tod = c.getTime();System.out.println(time:"+ tod);}}
Wenn Sie das Programm ausführen, startet das Programm im Netz.
Objekt c wird erstellt
Funktion setTime()wird vom Objekt aufgerufen c
Die Variable timewird auf den übergebenen Wert gesetzt
Obwohl Getter / Setter-Methoden in Java üblich sind, sind sie nicht besonders objektorientiert (OO). Tatsächlich können sie die Wartbarkeit Ihres Codes beeinträchtigen. Darüber hinaus ist das Vorhandensein zahlreicher Getter- und Setter-Methoden eine rote Fahne, dass das Programm aus OO-Sicht nicht unbedingt gut gestaltet ist.
Dieser Artikel erklärt, warum Sie keine Getter und Setter verwenden sollten (und wann Sie sie verwenden können), und schlägt eine Entwurfsmethode vor, die Ihnen hilft, aus der Getter / Setter-Mentalität auszubrechen.
var o ={ a:0}// `o` is now a basic objectObject.defineProperty(o,"b",{
get: function (){returnthis.a +1;}});
console.log(o.b)// Runs the getter, which yields a + 1 (which is 1)
Ich habe diese VIEL benutzt, weil sie fantastisch sind . Ich würde es verwenden, wenn ich Lust auf meine Codierung + Animation habe. Erstellen Sie beispielsweise einen Setter, der sich mit einem Setter befasst, Numberder diese Nummer auf Ihrer Webseite anzeigt. Wenn der Setter verwendet wird, animiert er die alte Nummer mit einem Tweener zur neuen Nummer . Wenn die Anfangszahl 0 ist und Sie sie auf 10 setzen, werden die Zahlen schnell von 0 auf 10 umgedreht, sagen wir eine halbe Sekunde. Benutzer lieben dieses Zeug und es macht Spaß, es zu erstellen.
2. Getter / Setter in PHP
Beispiel aus sof
<?php
classMyClass{private $firstField;private $secondField;public function __get($property){if(property_exists($this, $property)){return $this->$property;}}public function __set($property, $value){if(property_exists($this, $property)){
$this->$property = $value;}return $this;}}?>
Hier ist ein Beispiel, um die einfachste Art der Verwendung von Getter und Setter in Java zu erklären. Man kann dies auf einfachere Weise tun, aber Getter und Setter haben etwas Besonderes, wenn man ein privates Mitglied der Elternklasse in der Kindklasse in der Vererbung verwendet. Sie können dies durch Verwendung von Getter und Setter ermöglichen.
package stackoverflow;publicclassStackoverFlow{privateint x;publicint getX(){return x;}publicint setX(int x){returnthis.x = x;}publicvoid showX(){System.out.println("value of x "+x);}publicstaticvoid main(String[] args){StackoverFlow sto =newStackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();}}
Ich werde dich nicht herabstimmen (die Mühe nicht wert). Bitte beachten Sie, dass (1) Sie haben sich auf eine answerred Java Frage, wo die Programmsprache sollte in Java sein. (2) Wenn Sie posten möchten, stellen Sie sicher, dass das Layout korrekt ist. (3) Ihre Verwendung von Kapselung (Getter (oder Accessor) und Setter (oder Mutatoren)) ist falsch. Bitte schauen Sie nach, was Kapselung bedeutet ... (Überprüfen Sie die abgestimmte Antwort)
KarelG
1
@KarelG Entschuldigung, ich habe die Tags nicht gelesen. Ich habe es auf Java aktualisiert. Danke, dass du mich erkannt hast.
Antworten:
Tutorial ist dafür nicht wirklich erforderlich. Informieren Sie sich über die Kapselung
quelle
someObj.getTime().setHour(5)
, sollte dies keinen Einfluss aufsomeObj
den internen Status haben. Auch Setter und Getter (Accessoren und Mutatoren nach ihrem schickeren Namen) haben eine sehr strenge Methodensignatur, was bedeutet, dass Getter keine Parameter hat. Methoden im Allgemeinen sollten sowieso nur eines tun.this
Schlüsselwort ist optional, es sei denn, es liegt ein Konflikt mit etwas vor, das einen spezifischeren Bereich hat. In dem von Ihnen angegebenen Beispiel verfügt der erstellte Setter über einen einzelnen Parameter, dessen Name mit dem Feldnamen übereinstimmt. Daherthis.fieldName = fieldName
wird verwendet, um zu unterscheiden, dass das Feld zugewiesen wird, und nicht, wie der Parameter sich selbst zugewiesen wird, wiefieldName = fieldname
dies erreicht werden würde. Im Getter besteht kein solcher Konflikt.In Java sind Getter und Setter ganz normale Funktionen. Das einzige, was sie zu Gettern oder Setzern macht, ist die Konvention. Ein Getter für foo heißt getFoo und der Setter heißt setFoo. Im Falle eines Booleschen Werts heißt der Getter isFoo. Sie müssen auch eine spezifische Deklaration haben, wie in diesem Beispiel eines Getters und Setters für 'name' gezeigt:
Der Grund für die Verwendung von Gettern und Setzern, anstatt Ihre Mitglieder öffentlich zu machen, besteht darin, dass es möglich ist, die Implementierung zu ändern, ohne die Schnittstelle zu ändern. Viele Werkzeuge und Toolkits, die Reflexion zum Untersuchen von Objekten verwenden, akzeptieren nur Objekte mit Getter und Setter. JavaBeans müssen beispielsweise Getter und Setter sowie einige andere Anforderungen haben.
quelle
error: invalid method declaration; return type required
Wenn Sie das Programm ausführen, startet das Programm im Netz.
setTime()
wird vom Objekt aufgerufen ctime
wird auf den übergebenen Wert gesetztgetTime()
wird vom Objekt c aufgerufentod
undtod
ausgedrucktquelle
Vielleicht möchten Sie auch lesen: " Warum Getter- und Setter-Methoden böse sind ":
quelle
1. Die besten Getter / Setter sind schlau.
Hier ist ein Javascript-Beispiel aus Mozilla:
Ich habe diese VIEL benutzt, weil sie fantastisch sind . Ich würde es verwenden, wenn ich Lust auf meine Codierung + Animation habe. Erstellen Sie beispielsweise einen Setter, der sich mit einem Setter befasst,
Number
der diese Nummer auf Ihrer Webseite anzeigt. Wenn der Setter verwendet wird, animiert er die alte Nummer mit einem Tweener zur neuen Nummer . Wenn die Anfangszahl 0 ist und Sie sie auf 10 setzen, werden die Zahlen schnell von 0 auf 10 umgedreht, sagen wir eine halbe Sekunde. Benutzer lieben dieses Zeug und es macht Spaß, es zu erstellen.2. Getter / Setter in PHP
Beispiel aus sof
Zitate:
quelle
Hier ist ein Beispiel, um die einfachste Art der Verwendung von Getter und Setter in Java zu erklären. Man kann dies auf einfachere Weise tun, aber Getter und Setter haben etwas Besonderes, wenn man ein privates Mitglied der Elternklasse in der Kindklasse in der Vererbung verwendet. Sie können dies durch Verwendung von Getter und Setter ermöglichen.
quelle