Was ist performanter und/oder sauberer?

DLor

Aktives Mitglied
hallo Leute..

Welche dieser beiden CodeSchnipsel ist performanter und sauberer.
Welchen sollte man verwenden?

Vielen Dank im Voraus!

Java:
public void setHashMap(HashMap objects) {
		this.objects.clear();
		this.objects.putAll(objects);
	}

oder

Java:
public void setHashMap(HashMap objects) {
		this.objects = objects
	}
 
Zuletzt bearbeitet:

Ziegenpeter

Aktives Mitglied
Also ich würde direkt die untere Variante wählen, da ein nicht mehr benötigtes Objekt (ohne Referenz) eh vom Garbage Collector eingesammelt. Ein anderer Nachteil an der ersten Variante ist, dass sichergestellt sein muss, dass dieses Objekt nicht null ist. Du musst du HashMap also schon im Konstruktor mitübergeben bevor du diese Methode aufrufen kannst.
 

DLor

Aktives Mitglied
Sehe ich genauso!

Ich habe die erste Version bei unserer Entwicklung im Code gefunden und mich echt gewundert, warum denn 2 Aufrufe verwenden!
einfach ersetzen und wuppdich!

Oder kann es sein, wenn nach dem Methodenaufruf die übergebene Variable geändert wird, das sich dann auch der Inhalt der Objektvariablen geändert hat.

Also Call-By-Reference!!!
 
S

SlaterB

Gast
das eine ist eine Kopie, das andere nicht, mal abgesehen von den unterschiedlichen Parametern,

was performanter ist kannst du dir sicher denken,
der Unterschied in der Anwendung ist fast auch schon zu trivial um ihn noch zu nennen:
wenn mehrere Akteure dieselbe Map verwenden statt eigene Kopien, dann wirken sich Änderungen überall aus statt nur lokal,
das kann gerade gewollt sein, ist in der Regel aber eher als schlecht/ gefährlich/ schlecht nachzuvollziehen bezeichnet

edit: hast du nun ja auch schon erwähnt, ja, es kann sein
 
Zuletzt bearbeitet von einem Moderator:

tfa

Top Contributor
Es ist meistens wenig sinnvoll, (leichtgewichtige) Objekte wieder zu verwenden - wie in deiner ersten Methode. Das behindert nur den GC.

An der zweiten könnte problematisch sein, dass die Map von außerhalb des Objekts immer noch veränderbar ist, d.h. jemand könnte einfach objects.clear() aufrufen, ohne, dass es deine Klasse was davon merkt. Die Kapselung wird hier verletzt. Das kann ein Problem sein, muss es aber nicht. Es ist besser, defensiv zu programmieren.

Man könnte es auch so machen:
Java:
public void setMap(Map map) {
    this.objects = new HashMap(map);
}
Am besten noch zuzüglich Generics.
 

homer65

Top Contributor
Da ist schon ein Unterschied zwischen den beiden Varianten.
Im ersten Fall zeigen this.objects und objects auf unterschiedliche Speicherbereiche. Es wird als kopiert.
Im zweiten Fall zeigen this.objects und objects auf den gleichen Speicherbereich. Eine Änderung an this.objects wirkt sich dann auch auf objects aus.
 

ARadauer

Top Contributor
im grunde passiert ganz was anderes.

du hast zwei Säcke... im ersten Beispiel füllst du alles von einem Sack in den anderen.
im zweiten Beispiel ist der zweite Sack auf einmal der erste... wenn du etwas in den ersten rein gibst würde es auch im zweiten drinnen sein..
 

Ähnliche Java Themen

Neue Themen


Oben