Ist es eine gute / schlechte / akzeptable Praxis, das aktuelle Objekt in einem Methodenaufruf zu übergeben? Wie in:
public class Bar{
public Bar(){}
public void foo(Baz baz){
// modify some values of baz
}
}
public class Baz{
//constructor omitted
public void method(){
Bar bar = new Bar();
bar.foo(this);
}
}
Ist die Leitung konkret bar.foo(this)
akzeptabel?
Antworten:
Es gibt keinen Grund, es nicht zu verwenden, es
this
ist die aktuelle Instanz und es ist absolut legitim, es zu verwenden. Tatsächlich gibt es oft keinen sauberen Weg, dies wegzulassen.Also benutze es.
Da es schwer zu überzeugen ist, dass es ohne Beispiel akzeptabel ist (eine negative Antwort auf eine solche Frage ist immer leichter zu argumentieren), habe ich gerade eine der häufigsten
java.lang
Klassen eröffnet, dieString
eine, und natürlich habe ich zum Beispiel Beispiele für diese Verwendung gefundenSuchen Sie
(this
in großen "akzeptierten" Projekten, Sie werden es nicht verfehlen, es zu finden.quelle
this
bedeutet das Übergeben im realen Code (im Gegensatz zum vereinfachten Beispiel von OP) nicht, dass Sie einen bidirektionalen Link hinzufügen, beispielsweise aufgrund von Vererbung und Schnittstellen.Daran ist nichts auszusetzen. Was NICHT eine gute Praxis ist, ist, dasselbe innerhalb von Konstruktoren zu tun, da Sie einen Verweis auf ein noch nicht vollständig initialisiertes Objekt geben würden.
Hier gibt es eine Art ähnlichen Beitrag: Java leckt diesen im Konstruktor, wo erklärt wird, warum letzteres eine schlechte Praxis ist.
quelle
Car
KonstruktorWheel
Instanzen erstellen , einCar
ohneWheel
würde unvollständig initialisiert, während einWheel
ohne ein entsprechendesCar
ebenfalls unvollständig initialisiert würde. In diesem Fall kann es im Konstruktor des Autos akzeptabel sein, an den Konstruktorthis
des Rades zu übergeben. Die andere Alternative wäre, sowohl Auto als auch Rad einen privaten Konstruktor zu haben und eine Werksfunktion zu verwenden, die das Auto, das Rad und das Rad am Auto installiert. Aber sollte das eine statische Methode für das Auto oder eine statische Methode für das Rad sein?CarFactoryWheelInstallerProxy
, die die Räder für Sie installiert.Wheel
ist völlig untergeordnetCar
, und IMO sollte überhaupt nichts davon wissenCar
.this
innerhalb eines Konstruktors ist, wennthis
es an eine Methode oder einen Kontext übergeben wird, aus der die noch nicht vollständig konstruierte Objektreferenz an nicht vertrauenswürdige oder unbekannte Clients (oder an Clientcode, der davon ausgeht, dass sie eine Ansicht zu a hat) veröffentlicht wird vollständig konstruiertes Objekt). Der Übergangthis
von einem Konstruktor zu einer paketprivaten Methode, die eine gemeinsame Initialisierung durchführt, ist meiner Meinung nach nicht nur akzeptabel, sondern auch wünschenswert.Ja , aber Sie sollten in zwei Punkten vorsichtig sein
quelle
this
. Dies wäre unmöglich gewesen, wenn das Objekt nicht zugewiesen worden wäre.Es ist völlig normal und vollkommen akzeptabel.
quelle
Dies steht für das aktuelle Objekt. Was Sie tun, ist sytatisch korrekt, aber ich sehe keine Notwendigkeit dafür, wenn Sie die Methode in derselben Klasse aufrufen.
quelle
this
zwischen den beiden Klassen zu wechseln. Es ist also nicht erforderlich, die zusätzliche Komplexität hinzuzufügen.Es wird empfohlen , das aktuelle Objekt in einem Methodenaufruf zu übergeben, wenn weniger komplexe Alternativen vorhanden sind, um dasselbe Verhalten zu erzielen.
Per Definition wird eine bidirektionale Zuordnung erstellt, sobald sie
this
von einem Objekt zu einem anderen übergeben wird.Um Refactoring von Martin Fowler zu zitieren:
Theoretisch sollten wir also Alarmglocken hören, wenn wir feststellen, dass wir bestehen müssen,
this
und uns wirklich bemühen, andere Wege zu finden, um das vorliegende Problem zu lösen. Es gibt natürlich Zeiten, in denen es letztendlich Sinn macht, dies zu tun.Außerdem ist es häufig erforderlich, Ihr Design vorübergehend zu beschädigen und während einer längerfristigen Umgestaltung Ihres Codes „schlechte Praktiken“ auszuführen, um eine allgemeine Verbesserung zu erzielen. (Ein Schritt zurück, zwei Schritte vorwärts).
In der Praxis habe ich festgestellt, dass sich mein Code massiv verbessert hat, indem bidirektionale Links wie die Pest vermieden wurden.
quelle
this
bestanden wird.equals
Object ist. Dies ist sehr häufig: Die Empfangsmethode definiert ihr Argument als allgemeinere Klasse oder als Schnittstelle. Einer der Gründe, warum ein solches Muster in Java verwendet wird , besteht darin, unerwünschte Abhängigkeiten zu vermeiden. Bevor Sie länger gehen, würde ich vorschlagen, dass Sie sich die ansehen vielen Vorkommnissethis
als Argument in seriösen Java-Bibliotheken auftreten.this
Möglichkeit vermieden habe, meinen Code weiterzugeben. Ich würde anderen empfehlen, dies zu tun.Ja. Sie können es verwenden. Es ist nur üblich in der Programmierung zu bestehen.
this
Aber es gibt Vor- und Nachteile bei der Verwendung. Trotzdem ist es nicht gefährlich, dies zu tun.quelle
Nur um ein weiteres Beispiel hinzuzufügen, bei dem die Übergabe
this
korrekt ist und einem guten Design folgt: Besuchermuster . Im Besucherentwurfsmuster wird die Methodeaccept(Visitor v)
normalerweise so implementiert, wie sie nur aufgerufen wirdv.visit(this)
.quelle
Akzeptabel
Ausschnitt aus Oracle JAVA-Dokumenten:
quelle
this
als Parameter? “.this.some_variable
auf die Klassenvariable anstatt auf eine lokale Variable verweisen können. Es hat nichts mit der Übergabethis
als Parameter zu tun .Alles in Java wird als Wert übergeben. Objekte werden jedoch NIEMALS an die Methode übergeben!
Wenn Java ein Objekt an eine Methode übergibt, erstellt es zuerst eine Kopie eines Verweises auf das Objekt, nicht eine Kopie des Objekts selbst. Daher ist dies eine perfekt verwendete Methode in Java. Und am häufigsten gefolgt Verwendung.
quelle
this
Verweis auf einen primitiven Typ, und daher denke ich, dass Ihre "mehr Informationen" Verwirrung stiften.