Refactoring: Encapsulate Collection

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

public class Company {

	private String companyName;//the name of company
	private List<String> clerkList;//the clerk list
	
	//companyName,clearList getter and setter method
	........
}

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

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

有没有发现什么怪异的地方?在咱们得到list的引用后,能够直接操做list,而无需经过company对象。在面向对象的角度来看,这是不正确的设计思想。一样这样的代码看起来也不优雅。这个时候咱们引出Collections.unmodifiableList()方法,这个方法的做用是:数据库

Returns an unmodifiable view of the specified collection.

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

好了,如今我开始改编个人那个不太优雅的Company类:this

public class Company {

	private String companyName;//the name of company
	private List<String> clerkList = new ArrayList<String>();//the clerk list
	
	public void setCompanyName(String companyName) {
		this.companyName = companyName;
	}
	/**
	 * return a view of clerkList
	 * @return  clerk list
	 */
	public List<String> getClerkList() {
		return Collections.unmodifiableList(clerkList);
	}
	/**
	 * add a clerk
	 * @param clerkName
	 */
	public void addClerk(String clerkName){
		clerkList.add(clerkName);
	}
	/**
	 * remove the clerk
	 * @param clerkName
	 */
	public void removeClerk(String clerkName){
		clerkList.remove(clerkName);
	}
}
利用Collections的视图方法后,代码变的更加优美,更加健壮。
相关文章
相关标签/搜索