我应该替换一个简单的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]
答案 0 :(得分:2)
另一个选项也是在setter中为该字段创建一个新集合,但是你的解决方案更好,因为它避免了(不必要的)分配
或删除并在循环中添加每个类别
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);
}
}
}
因此您不必复制任何用于删除和/或添加类别的触发器
答案 1 :(得分:0)
所以,你要做的只是将一个字符串集合添加到Document
的{{1}}。
我将创建以下方法来执行此操作:
categories
因此,如果我希望public void addCategory(String categories){
this.categories.add(categories);
}
public void addCategory(Collection<String> categories){
this.categories.addAll(categories);
}
的{{1}}集不会通过传递参数引用进一步修改,我将使用Document
。
如果我希望categories
的{{1}}可以通过传递的参数引用进一步修改,我仍然可以使用原始的addCategory()