只是因为参考资料列表是不可变的并不意味着列表它指的是to 是不可变的。
Even if list
被做了final
这是允许的
// changing the object which list refers to
example.getList().add("stuff");
但这会not允许:
// changing list
example.list = new ArrayList<String>(); // assuming list is public
为了使列表不可变(也防止第一行),我建议您使用Collections.unmodifiableList http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableList%28java.util.List%29:
public class Example {
final private ArrayList<String> list;
Example(ArrayList<String> listArg) {
list = Collections.unmodifiableList(listArg);
}
}
(请注意,这会创建一个不可修改的列表视图。如果有人保留原始引用,则仍然可以通过该视图修改列表。)
对于字符串,这种行为是不可能的。那么这里有什么区别呢?
那是因为一个String
已经是不可变的(不可修改的),就像将列表变成不可修改的列表一样。
比较:
String data structure | List data structure
.-------------------------+------------------------------------.
Immutable | String | Collection.unmodifiableList(...) |
-----------+-------------------------+------------------------------------|
Mutable | StringBuffer | ArrayList |
'-------------------------+------------------------------------'