君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

今天看NFS-RPC的源码,看到有这样的代码:Collections.unmodifiableList(servers);突然想起来自己之前看重构时的一种叫Encapsulate Collection的思想,今天以代码为主线再来回顾下:

1public class Company {
2 
3    private String companyName;//the name of company
4    private List<String> clerkList;//the clerk list
5     
6    //companyName,clearList getter and setter method
7    ........
8}

我们封装了一个公司类,公司类中包含一个公司名和公司员工的属性,其中公司员工使用List存放。看似完美,然后我们在其他地方使用Company这个类:

1Company company = new Company();
2List<String> list = company.getClerkList();
3list.add("guolei");

有没有发现什么怪异的地方?在我们获得list的引用后,可以直接操作list,而无需通过company对象。在面向对象的角度来看,这是不正确的设计思想。同样这样的代码看起来也不优雅。这个时候我们引出Collections.unmodifiableList()方法,这个方法的作用是:

1Returns an unmodifiable view of the specified collection.

也就是返回一个集合,这个集合就像我们数据库的视图一样,只能read,而不能write。

好了,现在我开始改编我的那个不太优雅的Company类:

01public class Company {
02 
03    private String companyName;//the name of company
04    private List<String> clerkList = new ArrayList<String>();//the clerk list
05     
06    public void setCompanyName(String companyName) {
07        this.companyName = companyName;
08    }
09    /**
10     * return a view of clerkList
11     * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a>  clerk list
12     */
13    public List<String> getClerkList() {
14        return Collections.unmodifiableList(clerkList);
15    }
16    /**
17     * add a clerk
18     * @param clerkName
19     */
20    public void addClerk(String clerkName){
21        clerkList.add(clerkName);
22    }
23    /**
24     * remove the clerk
25     * @param clerkName
26     */
27    public void removeClerk(String clerkName){
28        clerkList.remove(clerkName);
29    }
30}

利用Collections的视图方法后,代码变的更加优美,更加健壮。 
posted on 2012-11-01 23:35  刺猬的温驯  阅读(160)  评论(0编辑  收藏  举报