今天看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的視圖方法後,代碼變的更加優美,更加健壯。