Java - "dieser" in Konstruktoren
Gut, dies ist eine sehr grundlegende Frage, ich habe noch nie codiert in java, aber ich bin eine Klasse zu schreiben, für einen Freund... Mit so etwas wie:
class myClass{
private string name;
public string getName() {
return this.name;
}
public void setName (int newValue) {
this.name = newValue;
}
private int number;
public int getNumber() {
return this.number;
}
public void setNumber (int newValue) {
this.number = newValue;
}
}
Den Weg ich dachte, der Bau der Konstruktor wurde:
public myClass (string name, int numbers) {
this.name = name;
this.number = number;
}
Meine Fragen:
- Ich mit dem gleichen Bezeichner für die Objekte wie für die Parameter. Hat "dies." zu vermeiden, irgendwelche Probleme hier?
- Ist es besser, verwenden Sie die set-Methoden, und wenn ja, sollte ich "das."?
Vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
name
bezieht sich auf die parameter und die Namenthis.name
bezieht sich auf die Instanz-Feld.name
undnumber
Felder final sind, also die Klasse ist unveränderlich. In meiner Erfahrung, es ist besser, zu starten von einer immutable-Klasse definiert, und bewegen sich nur in Richtung auf etwas veränderliche, wenn es eine legitime Notwendigkeit, dies zu tun.this
unterscheidet zwischen einer Instanz-variable und einen parameter einer Methode Variablen mit dem gleichen Namen.this
wenn Ihr parameter den gleichen Namen wie das Feld, das Sie einstellen möchten.Es gibt kein problem, dass die parameter mit den gleichen Namen wie das Feld; die
this.
explizit disambiguates und das Programm verhält sich, als gedacht.Je nach Programm kann es nicht vorteilhaft, setter, statt es direkt zu schreiben-Felder. Wenn Sie schreiben, die Werte direkt in den Konstruktor, dann umgehen Sie alle runtime-checks, die Sie vielleicht in Ihrem setter, die potenziell dazu führen, dass Ihr Objekt zum speichern von Daten, die er normalerweise nicht kann. Auf der anderen Seite, wenn Ihr setter versucht, etwas zu tun mit dem alten Wert ist, dann Sie wahrscheinlich nicht wollen, rufen Sie die setter-weil, im Konstruktor, könnte es nicht sein, eine sinnvolle alten Wert. Ich würde sagen, es ist nicht deutlich besser oder schlechter zu setzen, die Felder, die im Konstruktor als setter, so lange wie Sie vorsichtig, um zu vermeiden brechen die Klasse der Invarianten.
Ja. Mit der
this
Stichwort vermeidet Probleme.Falls es Logik in der get - /set-Methoden, sollten Sie mit Ihnen, statt. Ansonsten, festlegen der Werte im Konstruktor gültig ist.
1), Wenn das Objekt den scope-Eigenschaft ist das gleiche wie das argument name, den Sie verwenden müssen
this
zwischen Ihnen zu unterscheiden. Wenn es ein name clash-die lokale var oder argument Vorrang vor dem Eigentum.Aus diesem Grund, ich mag nicht immer die exakt gleichen Namen für jeden als es kann leicht dazu führen, dass Fehler.
2) ich würde auch die Verwendung der setter von innerhalb des Konstruktors, denn wenn es jemals benötigt, um eine Validierung oder eine andere operation durchgeführt, die auf das argument bei der Einstellung, die Sie nur haben, um die änderung in einem Ort. Ansonsten ist es Vervielfältigung und verstößt gegen die DRY (dont Repeat Yourself) Prinzip.
Ich tun würde:
Ja,
this.
vermeidet Probleme. Einige Leute empfehlen, die Art und Weise, wie Rogue Wave in Ihrem Buch Die Elemente des Java-Stil.Andere gemeinsame Wege, damit umzugehen, sind:
Namen der Mitglieder mit einem "m" oder "m_" - Präfix
Aufruf der Parameter einen anderen Namen, in der Regel ein einzelner Buchstabe oder eine abgekürzte version der name des Mitglieds
Aber ich bevorzuge den Weg, Sie sind jetzt mit
this
.