我应该在收集器中封装集合吗?

时间:2011-11-12 19:47:10

标签: java collections encapsulation setter

我应该替换一个简单的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 个答案:

答案 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()