Collections.unmodifiableList方法的使用与场景

from: http://blog.csdn.net/kjfcpua/article/details/8548589


[java]  view plain copy print ?
  1. <pre name="code" class="java">在公司接触到Collections.unmodifiableList(List<? extends T> list)) 觉得用法挺特殊的,所以学习了下,简单而言,看名字就知道,将参数中的List返回一个不可修改的List.  
  2.   
  3. 觉得以下这篇文章写得很好,说 明了它的应用场景。  
  4.   
  5. --------------------------------------------------------------------------------------  
  6.   
  7. 在《重构——改善既有代码的设计》一书中,有一种重构手法叫Encapsulate Collection  
  8. (封装集群),为了演示该重构手法,我写了四个类,通过对比重构前后的代码,加深对  
  9. 这一重构手法的理解。  
  10.   
  11. 类Student有一ArrayList属性,如果没有阅读《重构——改善既有代码的设计》一书,  
  12. 很多人可能会像我一样,如下设计类Student。但是,如果通过Student.getCourses()  
  13. 获得对ArrayList属性引用后,就可以任意为Student对象添加“课程”,而Student对象  
  14. 对此一无所知,这不符合面向对象编程的习惯。  
  15.   
  16. package com.readonlylist;  
  17.   
  18. import java.util.ArrayList;  
  19.   
  20. public class Student  
  21. {  
  22.     private String name;  
  23.   
  24.     private ArrayList<String> courses;  
  25.   
  26.     public Student(String name, ArrayList<String> courses)  
  27.     {  
  28.  this.name = name;  
  29.  this.courses = courses;  
  30.     }  
  31.       
  32.     public ArrayList<String> getCourses()  
  33.     {  
  34.         return courses;  
  35.     }  
  36.   
  37.     public void setCourses(ArrayList<String> courses)  
  38.     {  
  39.         this.courses = courses;  
  40.     }  
  41.   
  42.     public String getName()  
  43.     {  
  44.         return name;  
  45.     }  
  46.   
  47.     public void setName(String name)  
  48.     {  
  49.         this.name = name;  
  50.     }      
  51. }  
  52.   
  53. package com.readonlylist;  
  54.   
  55. import java.util.ArrayList;  
  56.   
  57. public class Test  
  58. {  
  59.     public static void main(String[] args)  
  60.     {  
  61.  ArrayList<String> list = new ArrayList<String>();  
  62.  list.add("001");  
  63.  list.add("002");  
  64.         Student s = new Student("Tom", list);  
  65.           
  66.         ArrayList<String> anotherList = s.getCourses();  
  67.           
  68.         anotherList.add("999");  
  69.           
  70.         System.out.println("Tom's course.length = " + s.getCourses().size());  
  71.     }  
  72. }  
  73.   
  74. 重构后的Student类如下所示:  
  75.   
  76. package com.readonlylist;  
  77.   
  78. import java.util.ArrayList;  
  79. import java.util.Collections;  
  80. import java.util.List;  
  81.   
  82. public class Student1  
  83. {  
  84.     private String name;  
  85.   
  86.     private ArrayList<String> courses;  
  87.       
  88.     public Student1(String name, ArrayList<String> courses)  
  89.     {  
  90.  this.name = name;  
  91.  this.courses = courses;  
  92.     }  
  93.   
  94.     public String getName()  
  95.     {  
  96.         return name;  
  97.     }  
  98.   
  99.     public void setName(String name)  
  100.     {  
  101.         this.name = name;  
  102.     }  
  103.       
  104.     public void addCourse(String course)  
  105.     {  
  106.  courses.add(course);  
  107.     }  
  108.       
  109.     public String removeCourse(String course)  
  110.     {  
  111.  boolean removed = courses.remove(courses);  
  112.    
  113.  if (removed)  
  114.  {  
  115.      return course;  
  116.  }  
  117.  else  
  118.  {  
  119.             return null;  
  120.  }  
  121.     }  
  122.       
  123.     public List<String> getCourses()  
  124.     {  
  125.  return Collections.unmodifiableList(courses);  
  126.     }  
  127. }  
  128.   
  129. package com.readonlylist;  
  130.   
  131. import java.util.List;  
  132. import java.util.ArrayList;  
  133.   
  134. public class Test1  
  135. {  
  136.     public static void main(String[] args)  
  137.     {  
  138.  ArrayList<String> list = new ArrayList<String>();  
  139.  list.add("001");  
  140.  list.add("002");  
  141.         Student1 s = new Student1("Tom", list);  
  142.           
  143.         List<String> anotherList = s.getCourses();  
  144.           
  145.         /** 
  146.          * throws java.lang.UnsupportedOperationException 
  147.          * should replace with s.addCourse(String course) 
  148.          */  
  149.         anotherList.add("999");   
  150.           
  151.         // never reached  
  152.         System.out.println("Tom's course.length = " + s.getCourses().size());          
  153.     }  
  154. }  
  155.   
  156. 重构后,Student1类,仅对外提供的getCourses()方法,而没有setCourses()方法,而且  
  157. 通过getCourses()方法获得的courses是“只读的”,如果你试图向其添加一个新课程,则  
  158. 抛出java.lang.UnsupportedOperationException。你必须通过Student1.addCourse()来  
  159. 向特定的Student1对象添加一个新课程。就好像,你必须让顾客自己向购物车里放食物,  
  160. 而不能在顾客毫不知情下,偷偷向其购物车里放食物。  
  161.   
  162. 真是万物皆通情理啊:)</pre><br>  
  163. <br>  
  164. <pre></pre>  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值