Guava之Immutable集合

大家都知道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);  

 

看上去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集合还能让开发者方便地在初始化设值:

 

[java]  view plain copy
 
  1. //Before  
  2. List<String> list = new ArrayList<String>();  
  3. list.add("day");  
  4. list.add("night");  
  5. //Now  
  6. ImmutableList<String> immutableList = ImmutableList.of("day""night");  
  7.           
  8. //Before  
  9. Set<String> set = new HashSet<String>();  
  10. set.add("day");  
  11. set.add("night");  
  12. //Now  
  13. ImmutableSet<String> immutaleSet = ImmutableSet.of("day""night");  
  14.           
  15. //Before  
  16. Map<Integer, String> map = new HashMap<Integer, String>();  
  17. map.put(0,"day");  
  18. map.put(1,"night");  
  19. //Now  
  20. ImmutableMap<Integer, String> immutaleMap = ImmutableMap.of(0"day"1,"night");  
  21. //Use builder pattern  
  22. ImmutableMap<Integer, String> immutaleMap2 = new ImmutableMap.Builder<Integer, String>()  
  23.                                                    .put(0,"day")  
  24.                                                    .put(1,"night")  
  25.                                                    .build();  
  26.           

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值