Objektedeklaration und Initialisierung

  • Themenstarter Themenstarter bri17
  • Beginndatum Beginndatum
B

bri17

Hallo,

kann mir jemand sagen, ob es einen Unterschied hinsichtlich Speicherbelegung etc. folgender 2 Varianten gibt, eine Instanz beim Schleifendurchlauf zu deklarieren und zu initialisieren? Ich bin mir dessen bewusst, dass die Instanz bei (1.) methodenweit und bei (2.) blockweit sichtbar ist. Welche Variante sollte man für welche Fälle bevorzugen? Gibt es da Empfehlungen?
1.)
Code:
Objekt obj = null;
for (...) {
    obj = new Objekt();
}
2.)
Code:
for (...) {
    Objekt obj = new Objekt();
}

Vielen Dank für eure Antworten!

Grüße Berit.
 
Hallo,

wenn ich ein Objekt nach der Schleife noch brauche benutze ich die 2. Variante. Falls ich das Objekt nach der Schleife noch brauche, dann nutze ich die erste Variante.
Meiner Meinung nach, gibt es keine Variante die zu bevorzugen ist. Kommt halt drauf an, was man machen möchte.


MFG
zEriX
 
Ja, der einzigste Unterschied ist die Laufzeit des Objekts....

Daher lebt das Object bei Variante 2 nur in der for Schleife. Bei Variante 1 lebt es noch weiter....bis die nächste geschweifte Endeklammer kommt bzw. die Methode zu Ende ist.

Wenn du Variante 1 benutzen musst, weil du das Object auch nach der for Schleife benutzen willst, so kannst du es auch händisch den Speicher freigeben, indem du das Object einfach wieder auf null setzt. Zwar bleibt "obj" noch bestehen, hat aber keinen "Inhalt" mehr, weil er ins leere zeigt.

Die Objektdaten werden erst dann aufgeräumt, wenn keine Referenz dazu mehr vorhanden ist, d.h. keine Variablen mehr darauf verweisen.
 
Danke für eure Antworten!

Heißt das, dass die x-malige Deklaration des Objekts bei (2.) keinen Unterschied zur einmaligen unter (1.) macht? Hinsichtlich Laufzeitverhalten o.ä.?

Gesetzt den Fall, ich benötige das Objekt nur innerhalb der Schleife, sollte ich dann Variante 2 bevorzugen? Wäre das Laufzeitverhalten das Gleiche, wenn ich Variante 1 verwende und nach dem letzten Durchlauf "obj" null zuweise?
 
Das ist eigentlich eine gute Frage. Ich denke da kommt es auf die Implementierung des Compilers oder gar der VM an. Im 2. Fall kommt ja immer wieder eine Deklaration vor. Also ist eine Deklaration + Initialisierung langsamer als nur eine Objektinstanzierung? ICh könnte mir vorstellen, dass der Compiler das gut wegoptimieren kann, bin aber nicht sicher.

P.S. bei Variante 1 brauchst du das objekt nicht unbedingt null setzen, falls du das in deinem letzten Post meinst. Sobald der Sichtbarkeitsbereich der Objektvariablen (Referenz, Pointer, was auch immer) zu Ende geht, wird das Objekt vom Garbage Collector irgendwann zerstört/freigegeben.
 
Prinzipiell ist der Unterschied sehr sehr gering.

Das letzte Objekt welches in der for Schleife instanziert wurde bleibt halt nach der for Schleife noch erhalten, das ist der Hauptunterschied.
Die Deklaration nimmt man aber hauptsächlich mit rein, das einfach nicht zich Laufvariablen durch ehemaligen Schleifen rumgeistern. Es nimmt ja auch die Namenswahl weg.

Es ist einfach die sauberere Wahl es mit rein zu nehmen, außer man braucht halt das letzte Objekt noch danach.
 
Zurück