Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于接受新集合的集合,在拥有一个mutator时有任何可预见的问题吗?_Java - Fatal编程技术网

Java 对于接受新集合的集合,在拥有一个mutator时有任何可预见的问题吗?

Java 对于接受新集合的集合,在拥有一个mutator时有任何可预见的问题吗?,java,Java,根据标题,是否有任何气味围绕着接受列表实例化以分配给实例变量的setter的规定 i、 e 公共类测试{ 私有列表字符串; 公共测试(){} 公共无效设置字符串(列表字符串){ this.strings=字符串; } } 有什么更好的方法(不考虑域的具体情况)?代码的问题是setter的调用者可以修改列表,因为调用者仍然有引用。考虑这个代码: Test test = new Test(); List<String> list = new ArrayList<String>

根据标题,是否有任何气味围绕着接受
列表
实例化以分配给实例变量的setter的规定

i、 e

公共类测试{
私有列表字符串;
公共测试(){}
公共无效设置字符串(列表字符串){
this.strings=字符串;
}
}

有什么更好的方法(不考虑域的具体情况)?

代码的问题是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!
Test Test=新测试();
列表=新的ArrayList();
测试设置管柱(列表);
list.clear();//哎呀!测试状态已更改,测试不知道!
更好的方法是使用列表的副本:

public void setStrings(List<Strings> strings) {
    this.strings = new ArrayList<String>(strings);
}
public void设置字符串(列表字符串){
this.strings=新的ArrayList(字符串);
}
这么好(我想你也有一个getter)我唯一可以做的不同的事情就是复制列表,而不是直接分配任务

public void setStrings(List<Strings> strings) {
    this.strings = new ArraysList<String>(strings);
}
public void设置字符串(列表字符串){
this.strings=新数组列表(字符串);
}

你所说的类变量是什么意思?是即时字段还是忘记了关键字static?哦,你不是指类变量而是指实例变量-我又删除了我的帖子。例如变量,我不明白为什么一个列表应该以其他对象以外的方式处理。所以我没有闻到任何难闻的气味;)我很高兴我问了这个问题。你能为所有的引用类型推荐一个拷贝习惯用法吗?是的。我还建议通过copy发布(即getter)集合这是确保封装的一个示例吗?为什么自动生成的getter/setter在默认情况下不这样做呢?不是封装——它是“安全发布”(不分发对可变字段的引用)和“防御性的”(不信任调用者))。自动生成的getter/setter可以作为一个选项来实现——您可以将其放在Eclipse愿望列表中。事实是,这“取决于”-如果您信任您的调用代码,则无需复制,但如果您正在创建一个其他人将使用的API,则应采取防御措施。
public void setStrings(List<Strings> strings) {
    this.strings = new ArraysList<String>(strings);
}