仅仅因为对列表的引用是不可变的,并不意味着它所引用的列表是不可变的。
即使做了,这也是允许的list
final
// changing the object which list refers to
example.getList().add("stuff");
但这不允许:
// changing list
example.list = new ArrayList<String>(); // assuming list is public
为了使列表不可变(也防止第一行),我建议您使用 Collections.unmodifiableList
:
public class Example {
final private ArrayList<String> list;
Example(ArrayList<String> listArg) {
list = Collections.unmodifiableList(listArg);
}
}
(请注意,这将创建列表的不可修改视图。如果有人保留了原始引用,则仍可以通过该引用修改列表。
对于字符串,此行为是不可能的。那么这里有什么区别呢?
这是因为 a 已经是不可变的(不可修改的),就像列表一样,如果你把它变成一个不可修改的列表。String
比较:
String data structure | List data structure
.-------------------------+------------------------------------.
Immutable | String | Collection.unmodifiableList(...) |
-----------+-------------------------+------------------------------------|
Mutable | StringBuffer | ArrayList |
'-------------------------+------------------------------------'