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

标签 java collections encapsulation 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]

最佳答案

是的,是的,你应该

另一个选项也是在 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/

相关文章:

java - java程序连接hive数据库出错

c# - 按日期和时间排序列表(字符串格式)

ios - 在行内滚动项目的一些问题

java - Java 中数组与集合的运行时安全性

java - 在 NetBeans 8 中封装 JavaFX 属性?

c++ - C++ 中的封装、数据隐藏、setter/getter

vba - 为什么 VBA Me 关键字不能访问自己模块中的私有(private)过程?

java - 根据字段值在 1 个查询中运行 2 个 mongodb 更新

java - Hadoop MapReduce、Java实现问题

java - 如何在运行时更改 View 大小