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的視圖方法後,代碼變的更加優美,更加健壯。
相關文章
相關標籤/搜索