Java 我是否也应该将集合封装在setter中?
我应该替换一个简单的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();
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()