对于不可变的Collections.unmodifiableMap 是否真的不可以变?
博客:http://blog.csdn.net/l2tp1012/article/details/39338209
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
package com.example.demo;
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; } } |
从这个代码可以看出:Collections.unmodifiableMap不是真正的不可以改变,其原理可以从Collections.unmodifiableMap的源代码看出来:
源代码如下:
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public V put(K key, V value)
{ throw new UnsupportedOperationException(); } public V remove(Object key) { throw new UnsupportedOperationException(); } public void putAll(Map<? extends K, ? extends V> m) { throw new UnsupportedOperationException(); } public void clear() { throw new UnsupportedOperationException(); } |
结论:Collections.unmodifiableMap是可以对map的值进行修改的,不可以采用put方式进行, 正确的姿势是对Value 采用Set方法进行修改
但是真实的使用场景Collections.unmodifiableMap是不需要对值进行修改的