今天看NFS-RPC的源码,看到有这样的代码:Collections.unmodifiableList(servers);突然想起来自己之前看重构时的一种叫Encapsulate Collection的思想,今天以代码为主线再来回顾下:
3 | private String companyName; //the name of company |
4 | private List<String> clerkList; //the clerk list |
6 | //companyName,clearList getter and setter method |
我们封装了一个公司类,公司类中包含一个公司名和公司员工的属性,其中公司员工使用List存放。看似完美,然后我们在其他地方使用Company这个类:
1 | Company company = new Company(); |
2 | List<String> list = company.getClerkList(); |
有没有发现什么怪异的地方?在我们获得list的引用后,可以直接操作list,而无需通过company对象。在面向对象的角度来看,这是不正确的设计思想。同样这样的代码看起来也不优雅。这个时候我们引出Collections.unmodifiableList()方法,这个方法的作用是:
1 | Returns an unmodifiable view of the specified collection. |
也就是返回一个集合,这个集合就像我们数据库的视图一样,只能read,而不能write。好了,现在我开始改编我的那个不太优雅的Company类:
03 | private String companyName; //the name of company |
04 | private List<String> clerkList = new ArrayList<String>(); //the clerk list |
06 | public void setCompanyName(String companyName) { |
07 | this .companyName = companyName; |
10 | * return a view of clerkList |
11 | * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a> clerk list |
13 | public List<String> getClerkList() { |
14 | return Collections.unmodifiableList(clerkList); |
20 | public void addClerk(String clerkName){ |
21 | clerkList.add(clerkName); |
27 | public void removeClerk(String clerkName){ |
28 | clerkList.remove(clerkName); |
利用Collections的视图方法后,代码变的更加优美,更加健壮。