通过查看
所以我运行了这个测试:
Collections
类的代码,我知道当我们使用方法unmodifiableList(List list)或unmodifiableCollection(Collection c)时,它不是创建一个新对象,而是返回相同对象的引用并覆盖可以修改List的方法[add,addall,remove,retainAll …]
所以我运行了这个测试:
List modifiableList = new ArrayList(); modifiableList.add ( 1 ); List unmodifiableList = Collections.unmodifiableList( modifiableList ); // unmodifiableList.add(3); // it will throw the exception modifiableList.add ( 2 ); System.out.println( unmodifiableList );
结果是[1,2].
现在重点是为什么它指的是同一个对象?为什么不创建新对象?
解决方法
(底部的问题答案)
当您创建不可修改的列表时,目的是不应该由您以外的人(即API的客户端)修改它.
方法unmodifiableList(..)创建一个类型为UnmodifiableList的新对象(但这不是公共类),它获取原始列表,并将所有方法委托给它,除了修改它的方法.
关键是,如文件中所述:
Returns an unmodifiable view of the specified list. This method allows modules to provide users with “read-only” access to internal lists.
举个例子:您有一个API检测到并且可以运行的设备列表,并且您希望为它们提供API的客户端.但他不应该改变它们.所以你有两个选择:
>给他一份你的清单的深层副本,这样即使他修改了它,这也不会改变你的清单
>给他一个不可修改的集合 – 他不能修改它,你不用创建一个新的集合.
现在,您可以找到问题标题的答案 – 不可修改的列表是原始集合的视图.因此,如果您需要向其添加新项目 – 比如说,您发现了一个刚刚插入的新设备,客户端将能够在其不可修改的视图中看到它.