根据Collections.emptyList()
方法的注释
它返回一个空的不可变列表。
如果我们直接分配给对象是合理的。 示例:
public class ImmutableList {
public static void main(String[] args){
List<String> namesList=Collections.emptyList();
String[] names = {"Name1", "Name2", "Name3"};
namesList.addAll(Arrays.asList(names));
}
private List<String> getList() {
String[] names = {"Name1", "Name2", "Name3"};
return Arrays.asList(names);
}
}
如果我们运行上述程序,则会引发以下异常
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
at org.learn.list.ImmutableList.main(ImmutableList.java:11)
但是,如果我们将方法的输出分配给该变量,则它运行良好。 示例:
public class ImmutableListTest2 {
public static void main(String[] args){
List<String> namesList=Collections.emptyList();
ImmutableListTest2 ce = new ImmutableListTest2();
namesList = ce.getList();
namesList.forEach(System.out::print);
}
private List<String> getList() {
String[] names = {"Name1", "Name2", "Name3"};
return Arrays.asList(names);
}
}
输出:
Name1Name2Name3
我的问题是,namesList在任何情况下都应该是不变的。 为什么我们能够在第二种情况下对该变量进行突变。
在所有情况下都应抛出UnsupportedOperationException
。
任何帮助表示赞赏。谢谢!
答案 0 :(得分:6)
namesList
不是一成不变的。它引用的原始List<String>
(由Collections.emptyList()
返回)是不可变的。
namesList
是List<String>
类型的变量。因此,您可以为其分配对任何List<String>
实例的引用,无论该实例是否可变。将List
返回的ce.getList()
分配给它时,它不再引用不变的List
。
如果要防止这种情况,请将其设置为final
变量,以防止重新分配该变量:
final List<String> namesList=Collections.emptyList();