对于接受新集合的集合有一个mutator的任何可预见的问题?

时间:2011-09-10 10:49:23

标签: java

根据标题,是否有任何气味围绕提供的setter接受List实例化以分配给实例变量?

public class Test{
    private List<String> strings;

    public Test() {}

    public void setStrings(List<Strings> strings) {
        this.strings = strings;
    }
}

什么是更好的方法(除了域名细节)?

2 个答案:

答案 0 :(得分:3)

您的代码的问题是您的setter的调用者可以修改列表,因为调用者仍然有一个引用。请考虑以下代码:

Test test = new Test();
List<String> list = new ArrayList<String>();
test.setStrings(list);
list.clear(); // oops! the state of Test has changed without Test knowing!

更好的方法是使用列表的副本

public void setStrings(List<Strings> strings) {
    this.strings = new ArrayList<String>(strings);
}

答案 1 :(得分:1)

这很好(我假设你也有一个吸气剂)我唯一可能做的就是拿一份清单而不是直接转让。

public void setStrings(List<Strings> strings) {
    this.strings = new ArraysList<String>(strings);
}