immutable HashMaps und clone()

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hallo,

ich habe zwei Fragen zu HashMaps:

1. Wie mache ich eine HashMap immutable?

Die Methode HttpServletRequest.getParameterMap() liefert mir laut Doku eine immutable Map zurück.

Google sagt mir dazu, das ich, um ein immutable Object zu erzeugen, alle Attribute dieser Klasse final sein müssen.

Aber wie kann das sein?

Wenn ich mir mit new() eine HashMap erzeuge ist die ja auch nicht immutable.....

2. Warum sollte man jemals die Methode clone() von HashMap einsetzen?

Die Api-Doc sagt:

Object clone()
Returns a shallow copy of this HashMap instance: the keys and values themselves are not cloned.

Wenn ich eh nur eine shallow copy kriege, kann ich doch auch einfach sowas machen wie:


Code:
HashMap foo= new HashMap();

HashMap bar = foo;

was dann exakt das gleiche ist wie:

Code:
HashMap foo= new HashMap();

HashMap bar = foo.clone();

oder?

Edit:

Und noch was verstehe ich nicht, warum darf ich das

Code:
final HashMap foo = new HashMap();
		foo.put("foo", "bar");
		foo.put("bar", "foo");

machen, das

Code:
final String hello = "hello";
		
hello = "world";

jedoch nicht?

Danke für alle Antworten!
 
S

SlaterB

Gast
1.)
Klasse überschreiben, nicht HashMap benutzen sondern eine andere Map,
final Variablen machen bei einer dynamischen Datenstrukur jetzt nicht soviel Sinn (siehe deine letzte Frage),
das Überschreiben der add-Operation würde aber Änderungen wirksam verhindern

-----------

2.)
bei der ersten Version hast du zweimal die gleiche Map,
fügst du in einer etwas ein, dann ist es in der anderen (derselben!) auch drin,

bei clone hast du dagegen zwei unterschiedliche Maps,
die die gleichen Objekte enthalten (würde man diese ändern, würde sich das wiederum auf beide Maps auwirken),
die Map-Objekte selber sind aber unterschiedlich und können unabhängig voneinander verändert werden

--------

3.)

du vergleichst Äpfel mit Birnen,

Code:
final HashMap foo = new HashMap(); 
foo = new HashMap();

und 

final String hello = "hello"; 
hello = "world";
wäre das gleiche, beides geht nicht, denn eine final Variable soll überschrieben werden

andersrum:

sowohl
Code:
final HashMap foo = new HashMap(); 
      foo.put("foo", "bar"); 
      foo.put("bar", "foo"); 
 
als auch

final String hello = "hello"; 
String st = hello.substring(2);
funktioniert,
denn in beiden Fällen bleibt die Variable unberührt, höchstens das Objekt wird benutzt
(bei String nciht mal verändert, da Strings eh unberänderbar sind)
 

byte

Top Contributor
Oder anders gesagt:
Man muss unterscheiden zwischen finalen primitiven Typen (int, double, ...) und finalen komplexen Typen (Object, HashMap, ...). Während finale primitive Objekte wirklich nur Lesezugriff bieten und den schreibenden Zugriff (Reflection mal ausgeklammert) verbieten, bezieht sich das final bei komplexen Typen nur auf die Referenz auf das Objekt und nicht auf die Member des Objekts.

In Deinem Fall hilft Dir vielleicht:

Code:
Map immutable = Collections.unmodifiableMap(theMap);

:?:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Immutable View auf StringBuffer? Allgemeine Java-Themen 13
J Klasse Immutable Allgemeine Java-Themen 14
Landei immutable Collections Allgemeine Java-Themen 27
J Immutable mit Interfaces möglich? Allgemeine Java-Themen 2
meez immutable final? Allgemeine Java-Themen 23
A Immutable Objects ? Allgemeine Java-Themen 8
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
M HashMaps: Wert erweitern Allgemeine Java-Themen 3
X Collections Hashmaps vergleichen Allgemeine Java-Themen 23
H 2D Array aus HashMaps Allgemeine Java-Themen 7
Pastafari Iterator über nested HashMaps Allgemeine Java-Themen 7
Shoox HashMaps in List? Allgemeine Java-Themen 3
S Frage zu mehrfach indizierten Hashmaps Allgemeine Java-Themen 4
J zwei HashMaps vereinen Allgemeine Java-Themen 3
D Mehrdimensionale HashMaps Allgemeine Java-Themen 6
W HashMaps - Suchmöglichkeit - Wildcarts? Allgemeine Java-Themen 5
J Methoden clone(), arraycopy(): ein- und zweidimensionale Arrays Allgemeine Java-Themen 8
A deepcopy mit clone() Allgemeine Java-Themen 2
R Gleiche Objektreferenz trotz clone()? Allgemeine Java-Themen 12
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
H Frage zu clone() Allgemeine Java-Themen 5
xehpuk clone() wegen leerem Cloneable quasi nutzlos? Allgemeine Java-Themen 6
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
G Object mit clone kopieren Allgemeine Java-Themen 21
R Eigenes Objekt - clone() Allgemeine Java-Themen 2
V clone() ? Allgemeine Java-Themen 4
T abstract + clone() = BUMM! Allgemeine Java-Themen 3
M Gibt es eigentlich einen Standalone-Java-ICQ-clone Allgemeine Java-Themen 19
M clone-methode nicht verfügbar Allgemeine Java-Themen 10
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
M Problem mit Generics und clone() Allgemeine Java-Themen 2
K The method clone() from the type Object is not visible. Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben