zoukankan      html  css  js  c++  java
  • Immutable集合

    转自:https://blog.csdn.net/michaellufhl/article/details/6314333

    大家都知道JDK提供了Collections.UnmodifiableList(),Collections.UnmodifiableSet()和Collections.unmodifiableMap()这些包装方法。事实上它们的实现都是包装了原来的集合对象,然后在add,put,remove这样的方法上面抛出UnsupportedOperationException。这样就实现了Unmodifiable特性。这种做法在编程中叫作转发(forwarding)。

        这样的Unmodifiable集合能满足一般的需求,但是如果碰到下面的情况 - 例如你需要定义2个常数放在List里面然后把这个List做成final,而且用Collections.UnmodifiableList()包装一下,就以为高枕无忧了:

    [java] view plain copy
     
    1. List<String> l = new ArrayList<String>();  
    2. l.add("FULL");  
    3. l.add("LOW");  
    4. final List<String> unmodifiableList = Collections.unmodifiableList(l);  //返回指定列表的不可修改视图。Exception in thread "main" java.lang.UnsupportedOperationException

    看上去unmodifiableList是不可改变的,但是如果这样:

    [java] view plain copy
     
    1. l.add("NORMAL");  

        你再看unmodifiableList已经被加了"NORMAL"。

        当然有经验的程序员可以把原来的List放到新作的List然后Unmodifiable包装一下:

    [java] view plain copy
     
    1. List<String> unmodifiableList= Collections.unmodifiableList(new ArrayList(l));  

    但是已经有Google Collection的Immutable集合解决了这个问题。刚才unmodifiableList可以这样来做:

    [java] view plain copy
     
    1. ImmutableList<String> unmodifiableList = ImmutableList.copyOf(l);  

        除此之外Immutable集合还提供了ImmutableSet和ImmutableMap来包装集合。

        为了便捷开发Immutable集合还能让开发者方便地在初始化设值:

     
    //Before 定义集合常量
            List<String> list = new ArrayList<String>();
            list.add("day");
            list.add("night");
            //Now1
            ImmutableList<String> immutableList = ImmutableList.of("day", "night");
            //Now2
            List<String> CONSTANT_LIST1 = ImmutableList.copyOf(Lists.newArrayList("day","night"));
            //Now3
            List<String> CONSTANT_LIST2 =
                    new ImmutableList.Builder<String>()
                            .add("day")
                            .add("night")
                            .build();
    
            //Before
            Set<String> set = new HashSet<String>();
            set.add("day");
            set.add("night");
            //Now
            ImmutableSet<String> immutaleSet = ImmutableSet.of("day", "night");
    
            //Before
            Map<Integer, String> map = new HashMap<Integer, String>();
            map.put(0, "day");
            map.put(1, "night");
            //Now1
            ImmutableMap<Integer, String> immutaleMap = ImmutableMap.of(0, "day", 1, "night");
    
            //Now2 Use builder pattern
            ImmutableMap<Integer, String> immutaleMap2 = new ImmutableMap.Builder<Integer, String>()
                    .put(0, "day")
                    .put(1, "night")
                    .build();

        值得注意的是这些Immutable集合都是abstract类,它们的初始化都是由of(),copyOf()以及builder模式这样方式来实现。这也体现了作者在编程时候对代码灵活度的考虑。

        下载地址: google guava

  • 相关阅读:
    [EasyUI美化换肤]更换EasyUi图标
    [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
    SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
    对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
    EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
    采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
    android ViewFlipper(翻转视图) 使用
    Android 下拉列表Spinner 使用
    Android选项卡TabHost功能和用法
    【android,eclipse解决】eclipse insert "}" to complete ClassBodyR.java
  • 原文地址:https://www.cnblogs.com/hahajava/p/9652947.html
Copyright © 2011-2022 走看看