1. 概述
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
- 傳回指定映射的不可修改視圖。此方法允許子產品為使用者提供對内部映射的“隻讀”通路。在傳回的映射上執行的查詢操作将“讀完”指定的映射。
-
試圖修改傳回的映射(不管是直接修改還是通過其 collection 視圖進行修改)将導緻抛出 UnsupportedOperationException。
如果指定映射是可序列化的,則傳回的映射也将是可序列化的。
-
- 參數:
-
- 将為其傳回一個不可修改視圖的映射。m
傳回: - 指定映射的不可修改視圖。
-
2. demo
2.1 code (摘自 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 控制台輸出
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. 解釋
unmodifiableMap方法傳回的Map, 它本身不允許修改, 就是說其中每一個entry引用不允許修改,但是entry中的value如果是對象,value引用的對象的屬性值是可以修改的
轉載于:https://www.cnblogs.com/rocky-fang/p/6702688.html