【发布时间】:2016-01-22 12:47:26
【问题描述】:
例如,我有这个:
public class Container{
private final List<String> strs;
/**
* Contructs {@code Container} by a given {@code List}
* The content of the list referenced should not be modified
* after the constructor invocation.
*/
public Container(List<String> strs){
this.strs = strs;
}
//Other staff
}
Container 的状态可以在构造后修改,但我们在文档中禁止。对象可以被视为不可变的吗?在构造函数中进行复制并不是完全可取的。
不变性是为了线程安全。
【问题讨论】:
-
依靠 cmets 来指导程序员的选择是不好的,因为我们并不总是阅读 cmets。更多时候,我们依靠示例代码和直觉来决定可以用对象做什么。
-
“在构造函数中复制并不完全可取。”。好吧,但如果你不这样做,你就不能声称是不可变的。
-
就个人而言,我会在构造函数中进行复制。这给了我一个我可以保证不会添加、重新排序或丢失元素的列表。但它是否应该是深拷贝(即元素本身是否应该是不可变的)取决于具体情况。
-
“调用”(“c”不是“k”)
-
在我看来,问题不在于我们是否可以——当然我们可以——而是我们是否应该 .
标签: java multithreading immutability