天天看點

java.util.Collections.unmodifiableMap 示例

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