Java. util. Collections. unmodifiableMap example, javacollections
1. Overview
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
-
Returns the unchangeable view of the specified ing. This method allows the module to provide users with "read-only" access to internal mappings. The query operation executed on the returned ing reads the specified ing.
-
An attempt to modify the returned ing (whether directly modified or modified through its collection view) will cause UnsupportedOperationException.
If the specified ing is serializable, the returned ing is also serializable.
-
-
Parameters:
-
m
-A ing that cannot be modified is returned for the view.
-
Return Value:
-
The specified ing cannot be modified.
2. demo
2.1 code (from http://stackoverflow.com/questions/3999086/when-is-the-unmodifiablemap-really-necessary)
package com.rocky.catest;import java.util.Collections; import java.util.HashMap; import java.util.Map; public class SeeminglyUnmodifiable { private Map<String, Point> startingLocations = new HashMap<String, Point>(3); public SeeminglyUnmodifiable(){ startingLocations.put("LeftRook", new Point(1, 1)); startingLocations.put("LeftKnight", new Point(1, 2)); startingLocations.put("LeftCamel", new Point(1, 3)); //..more locations.. } public Map<String, Point> getStartingLocations(){ return Collections.unmodifiableMap(startingLocations); } public static void main(String [] args){ SeeminglyUnmodifiable pieceLocations = new SeeminglyUnmodifiable(); Map<String, Point> locations = pieceLocations.getStartingLocations(); Point camelLoc = locations.get("LeftCamel"); System.out.println("The LeftCamel's start is at [ " + camelLoc.getX() + ", " + camelLoc.getY() + " ]"); //Try 1. update elicits Exception try{ locations.put("LeftCamel", new Point(0,0)); } catch (java.lang.UnsupportedOperationException e){ System.out.println("Try 1 - Could not update the map!"); } //Try 2. Now let's try changing the contents of the object from the unmodifiable map! camelLoc.setLocation(0,0); //Now see whether we were able to update the actual map Point newCamelLoc = pieceLocations.getStartingLocations().get("LeftCamel"); System.out.println("Try 2 - Map updated! The LeftCamel's start is now at [ " + newCamelLoc.getX() + ", " + newCamelLoc.getY() + " ]"); } } class Point{ public float x; public float y; public Point(float x, float y){ setLocation(x, y); } public void setLocation(float x, float y){ this.x = x; this.y = y; } public float getX(){ return x; } public float getY(){ return y; } }
2.2 console output
The LeftCamel's start is at [ 1.0, 3.0 ]Try 1 - Could not update the map!Try 2 - Map updated! The LeftCamel's start is now at [ 0.0, 0.0 ]
3. Explanation
The Map returned by the unmodifiableMap method is not allowed to be modified, that is, each entry reference is not allowed to be modified. However, if the value in the entry is an object, the attribute value of the object referenced by the value can be modified.
-
-
-