# Unveränderbare Objekte



## Gast (6. Feb 2009)

Moin,

was haltet ihr von unveränderbare (immutable) Objekte? Verwendet ihr das oft oder beachtet ihr das eher weniger,
Was mir vor kurzem klar geworden ist, ist dass wenn ein Objekt ein anderes Objekt beinhaltet und ich diese andere Objekt verändern kann, ich ja das ganze Objekt zerstören kann und das ja auch ein Sicherheitsproblem ist.
Also ist die einzige Möglichkeit das zu umgehen, immer eine Kopie des übergebenen Objektes zu erzeugen und das zu speichern und andererseite nur eine Kopie eines Objektes z.B.: bei einer Methode zurückzugeben.

Wie schauts da mit der Performance aus und die handhabt ihr diesen Sachverhalt?


----------



## SlaterB (6. Feb 2009)

das Einsparen von Kopien ist für mich auch der Hauptgrund für immutable,
dazu kommt noch ein fester Hashcode für Keys in einer HashMap

aber das würde ich nicht unbedingt als Sicherheitsproblem bezeichnen,
eher als Ungewollte-Fehler-Vermeidung


----------



## maki (6. Feb 2009)

Immutable ist 'ne gute Sache für Valueobjects, d.h. Objekte die anhand ihrer Werte eindeutig werden.

Ist aber eine Designfrage, schliesslich geht das nicht mit allen Klassen, gibt ja schliesslich noch Entitäten, diese werden ausschliesslich anhand ihrer Id eindeutig.

Valueobjeects dürfen übrigens keine nicht-Valueobjects referenzieren, das widerspricht dem ganzen Konzept.


----------



## tfa (6. Feb 2009)

+ Immutable Objekte sind absolut Thread-sicher (ohne synchronized).


----------



## hdi (6. Feb 2009)

Ach echt? D.h. ich kann 24 Threads auf einen String losjagen, einfach so?
Was sind denn eigentlich außer String noch Immutable Objekte, also von den Standard-Klassen?


----------



## SlaterB (6. Feb 2009)

dass Integer & Co sowie BigDecimal & Co dazuzählen, kannst du dir ja denken,


Locale, Pattern, Formatter sicher auch, 
im Idealfall je nach Verwendung Date, Enums


----------



## Ebenius (6. Feb 2009)

SlaterB hat gesagt.:
			
		

> Locale, Pattern, Formatter sicher auch,
> im Idealfall je nach Verwendung Date, Enums


java.util.Formatter schon, java.util.logging.Formatter nicht.  Dates immer.
Mir fällt ad hoc noch ein: Object, Class, Boolean


----------



## SlaterB (6. Feb 2009)

Dates immer?

Date d = new Date();
      System.out.println(d);
      d.setTime(4509809);
      System.out.println(d);


----------



## Ebenius (6. Feb 2009)

SlaterB hat gesagt.:
			
		

> d.setTime(4509809);


 Die Methode verdränge ich immer wieder... ;-)


----------



## tfa (6. Feb 2009)

hdi hat gesagt.:
			
		

> Ach echt? D.h. ich kann 24 Threads auf einen String losjagen, einfach so?


Klar. String ist doch immutable.


----------

