2011-11-12 37 views
2

我應該更換一個簡單的二傳手我是否應該將集合封裝在setter中?

public void setCategories(Set<String> categories) 
{ 
    this.categories = categories; 
} 

像這樣的東西:

public void setCategories(Collection<String> categories) 
{ 
    this.categories.clear(); 
    if (categories != null) 
    { 
     this.categories.addAll(categories); 
    } 
} 

所以對象的屬性類別將無法通過傳遞的參數參考進一步修改,因爲它可以:

Set<String> categories = new TreeSet<String>(); 
categories.add("cityguide"); 
categories.add("other"); 
Document document = new Document("http://unique-address.com"); 
document.setCategories(categories); 
System.out.println(categories); //outputs [cityguide, other] 
System.out.println(document.getCategories()); //outputs [cityguide, other] 
document.setCategories(categories); 
categories.add("traveling"); 
System.out.println(categories); //outputs [cityguide, other, traveling] 
System.out.println(document.getCategories()); //outputs [cityguide, other, traveling] 

回答

2

是的,是的,你應該

另一種選擇,也使得在二傳手領域的新集,但您的解決方案是更好,因爲它避免(不必要的)分配

或刪除,並在一個循環中添加的每個類別

public void setCategories(Collection<String> categories) 
{ 
    for(String cat:this.category.toArray(new String[0])){//using toArray to avoid ConcurrentModificationException 
     removeCategory(cat); 
    } 
    if (categories != null) 
    { 
     for(String cat:categories){ 
      addCategory(cat); 
     } 
    } 
} 

所以你將不必重複任何觸發器以刪除和/或添加類別

0

因此,您只需將字符串集合添加到Documentcategories即可。

我只是將創建下列方法去做:

public void addCategory(String categories){ 
      this.categories.add(categories); 
} 

public void addCategory(Collection<String> categories){ 
     this.categories.addAll(categories); 
} 

所以,如果我想Documentcategories組將無法通過傳遞的參數參考進行進一步修改,我會用addCategory()

如果我想Documentcategories可以通過傳遞的參數參考進行進一步修改,我仍然可以使用原來的setCategories()

相關問題