• 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引用的对象的属性值是可以修改的

     
  • 相关阅读:
    Java读取压缩文件信息
    中国菜刀 一句话木马
    java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
    Hadoop搭建全程
    instr模糊查询使用及注意事项
    idea离线安装SonarLint
    Previous operation has not finished; run 'cleanup' if it was interrupted] 的排错过程
    vue中excel文件上传总结
    IDEA 2019.1离线安装lombok
    @Data注解失效解决办法
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/6702688.html
Copyright © 2020-2023  润新知