zoukankan      html  css  js  c++  java
  • Refactoring: Encapsulate Collection

    今天看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的视图方法后,代码变的更加优美,更加健壮。 
  • 相关阅读:
    隐藏虚拟网卡
    Eclipse3.2编码选中对象着色
    PHP里的字符串定义小技巧汇总
    【原创】交互型网页防止IP欺骗的技巧
    VS2005的报错让我“二”了一把
    【原创】利用PHP5的__autoload代替繁琐低效的的外部文件包含方式
    关于WebDataWindow.Net的一些开发小细节
    PHP效率损失操作汇总
    动态添加按钮及关联方法(带参数)
    GridView中模版列使用RowCommand事件如何得到当前列的行索引或记录ID
  • 原文地址:https://www.cnblogs.com/chenying99/p/2750500.html
Copyright © 2011-2022 走看看