我应该更换一个简单的二传手
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]
最佳答案
是的,是的,你应该
另一个选项也是在 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);
}
}
}
因此您不必复制任何用于删除和/或添加类别的触发器
关于java - 我是否也应该将集合封装在 setter 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107076/