方法调用:Collections.emptyList()在不同情况下显示不同的行为?

时间:2018-08-07 10:58:48

标签: java list exception collections

根据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。 任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:6)

namesList不是一成不变的。它引用的原始List<String>(由Collections.emptyList()返回)是不可变的。

namesListList<String>类型的变量。因此,您可以为其分配对任何List<String>实例的引用,无论该实例是否可变。将List返回的ce.getList()分配给它时,它不再引用不变的List

如果要防止这种情况,请将其设置为final变量,以防止重新分配该变量:

final List<String> namesList=Collections.emptyList();