Ich habe Objekte gesehen, die in Java-Code erstellt wurden, ohne einen Verweis auf das Objekt zu speichern. In einem Eclipse-Plugin habe ich beispielsweise eine SWT-Shell gesehen, die folgendermaßen erstellt wurde:
new Shell();
Dieses neue Shell-Objekt wird nicht in einer Variablen gespeichert, sondern es wird solange referenziert, bis das Fenster freigegeben wird. Dies geschieht standardmäßig, wenn das Fenster geschlossen wird.
Ist es eine schlechte Praxis, solche Objekte zu erstellen, ohne einen Verweis darauf zu speichern? Oder war die Bibliothek schlecht gestaltet? Was ist, wenn ich keine Referenz benötige, sondern nur die "Nebenwirkungen" des Objekts sehen möchte? Sollte ich trotzdem eine Referenz speichern?
AKTUALISIEREN:
Zugegeben, mein obiges Beispiel ist schlecht. Während ich solche UI-Elemente gesehen habe, wäre das Erstellen einer solchen SWT-Shell wahrscheinlich sinnlos, da Sie die open-Methode für die Shell-Instanz aufrufen müssen. Es gibt bessere Beispiele von aix, wie zum Beispiel die folgenden aus dem Java-Tutorial zur Parallelität :
(new HelloThread()).start();
Diese Praxis wird in vielen Zusammenhängen gesehen, daher bleiben die Fragen offen. Ist es eine gute Übung?
Shell.createTopLevelShell()
oder was auch immer zu haben, als in diesem Fall einen Konstruktor zu verwenden. Aber funktional gibt es kaum einen Unterschied.)dispose()
d sein: Regel 1: Wenn Sie sie erstellt haben, entsorgen Sie sie. eclipse.org/articles/swt-design-2/swt-design-2.htmlAntworten:
Es gibt ein persönliches Präferenzelement, aber ich denke, dass es nicht unbedingt eine schlechte Praxis ist, die Referenz nicht zu speichern.
Betrachten Sie das folgende hypothetische Beispiel:
Wenn für jede Datei ein neues Prozessorobjekt erstellt werden muss und nach dem
process()
Aufruf nicht mehr benötigt wird , macht es keinen Sinn, einen Verweis darauf zu speichern.Hier ist ein weiteres Beispiel aus dem Java Concurrency Tutorial :
Ich habe viele andere Beispiele gesehen, bei denen die Referenz nicht gespeichert ist und die für mein Auge völlig in Ordnung sind, wie zum Beispiel:
(Das
StringBuilder
Objekt wird nicht behalten.)Es gibt ähnliche Muster, an denen common.lang's
HashCodeBuilder
et al.quelle
getInstance()
ist eine Factory und kein Singleton).process
.Wenn Sie nicht brauchen einen Verweis auf das erstellte Objekt, dann halten Sie nicht auf die Referenz. So einfach ist das.
quelle
Im Allgemeinen empfiehlt es sich, Verweise so schnell wie möglich freizugeben. Ich sehe keinen Unterschied zwischen:
und
In Bezug auf den Code vermeiden Sie lediglich die Verwendung eines Variablennamens, was positiv sein kann. Der JIT-Compiler ist im Allgemeinen schlau genug, um zu erkennen, dass er den Thread nach seiner letzten Verwendung müllsammeln kann, sodass es vom Standpunkt der Leistung aus wahrscheinlich keinen Unterschied gibt.
Das einzige wirkliche Problem, das Sie vermeiden sollten, ist der Code im Konstruktor-Anti-Pattern , aber es hört sich nicht so an, als würden Sie danach fragen.
quelle
Dies kann schlecht sein, wenn Sie SWT verwenden, da Sie dort nach sich selbst aufräumen müssen (Aufruf der dispose () -Methode). Aber für andere Klassen (nicht SWT) ist es ok.
Hier ist ein Artikel zum Verwalten von Betriebssystemressourcen
quelle
Zuallererst ärgern Sie Leute, die C oder C ++ vor Java gelernt haben. Ich überlasse das dem Leser als Übung, um zu entscheiden, ob das ein Pro oder ein Contra ist.
Während es sicherlich Situationen gibt, in denen Objekte sehr kurzlebig sind, ist es die meiste Zeit, wenn etwas komplex genug ist, um ein Objekt zu erstellen, komplex genug, um gute Gründe zu haben, einen Verweis zu behalten, weshalb es nicht beibehalten werden sollte Dies ist zumindest eine Warnung, um zu überprüfen, ob Sie etwas verpasst haben.
In einem Tutorial kümmert sich zum Beispiel niemand darum, einen Thread-Verweis zu führen. Wenn jedoch im wirklichen Leben etwas so lange dauert, dass Sie einen Thread erzeugen möchten, dauert es normalerweise so lange, dass Sie den Thread abbrechen können. Wenn die Lebensdauer kürzer ist, laichen Sie normalerweise eine Reihe von Threads, die Sie benötigen,
join
bevor Sie fortfahren. Oder Sie möchten sicherstellen, dass Ihre Thread-Erstellung tatsächlich erfolgreich war. Oder Sie möchten sicherstellen, dass der Thread sauber endet, bevor Sie ihn beenden. Du bekommst das Bild.quelle