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引用的對象的屬性值是可以修改的