Java 我是否也应该将集合封装在setter中?

Java 我是否也应该将集合封装在setter中?,java,collections,encapsulation,setter,Java,Collections,Encapsulation,Setter,我应该替换一个简单的setter吗 public void setCategories(Set<String> categories) { this.categories = categories; } public void集合类别(集合类别) { 这个。类别=类别; } 比如说: public void setCategories(Collection<String> categories) { this.categories.clear();

我应该替换一个简单的setter吗

public void setCategories(Set<String> categories)
{
    this.categories = categories;
}
public void集合类别(集合类别)
{
这个。类别=类别;
}
比如说:

public void setCategories(Collection<String> categories)
{
    this.categories.clear();
    if (categories != null)
    {
        this.categories.addAll(categories);
    }
}
public void集合类别(集合类别)
{
this.categories.clear();
如果(类别!=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]
Set categories=new TreeSet();
类别。添加(“城市指南”);
类别。添加(“其他”);
文档=新文档(“http://unique-address.com");
文件.集合类别(类别);
系统输出打印项次(类别)//输出[城市指南,其他]
System.out.println(document.getCategories())//输出[城市指南,其他]
文件.集合类别(类别);
类别。添加(“旅行”);
系统输出打印项次(类别)//输出[城市指南、其他、旅行]
System.out.println(document.getCategories())//输出[城市指南、其他、旅行]
是的,是的,你应该

另一种选择是在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);
        }
    }
}
public void集合类别(集合类别)
{
对于(字符串cat:this.category.toArray(新字符串[0]){//使用toArray避免ConcurrentModificationException
移除类别(cat);
}
如果(类别!=null)
{
用于(字符串类别:类别){
添加类别(cat);
}
}
}

因此,删除和/或添加类别时不必重复任何触发器

因此,您只需将字符串集合添加到
文档的
类别中即可

我将创建以下方法来完成此操作:

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

public void addCategory(Collection<String> categories){
         this.categories.addAll(categories);
}
public void addCategory(字符串类别){
此.categories.add(categories);
}
公共类别(集合类别){
this.categories.addAll(categories);
}
因此,如果我希望
文档
类别
集不会通过传递的参数引用进行进一步修改,我将使用
addCategory()

如果我想通过传递的参数引用进一步修改
文档
类别
,我仍然可以使用原始的
setCategories()