Retrofit源码研究之Collections类的unmodifiableList()方法

原创 2015年11月19日 16:45:59



在Retrofit源码中,有一个Retrofit类,其中有一个方法callAdapterFactories(),代码如下:

public List<CallAdapter.Factory> callAdapterFactories() {
    return Collections.unmodifiableList(adapterFactories);
}

adapterFactories已经是一个集合,而callAdapterFactories()方法需要返回一个集合,为何不直接返回它呢?

在网上搜了搜,算是找到了答案,下面是一个示例代码:

public class Main {

	public static void main(String[] args) {
		
		List<String> books = new Library().getBooks();
		books.add("yuwen");
	}
}

class Library{
	
	ArrayList<String> books = new ArrayList<String>();

	public ArrayList<String> getBooks() {
		return books;
	}

	public void setBooks(ArrayList<String> books) {
		this.books = books;
	}

}

图书馆类Library是一个很典型的JavaBean,有get方法,有set方法。

在main()方法中 获取到集合后,就能够添加书籍,但是,这样直接在集合中添加书籍,绕过了图书馆类,在某些场景中是不适用的(未想到具体场景...),在那些场景中,只能通过提供的方法,一本本添加书籍,这样怎么办?

刚好,Java提供给了我们这样一个方法:

Collections.unmodifiableList(List list);
Returns an unmodifiable view of the specified list. This method allows modules to provide users with "read-only" access to internal lists. Query operations on the returned list "read through" to the specified list, and attempts to modify the returned list, whether direct or via its iterator, result in an UnsupportedOperationException.


上面的一堆英文是摘自源码注释,只需要看最后一个单词即可。

UnsupportedOperationException.,这明显是一个异常,阅读完注释就可以看出来,用上这个方法,就会返回一个只读的list集合。我们将代码更改,如下:

public class Main {

	public static void main(String[] args) {
		
		List<String> books = new Library().getBooks();
		books.add("yuwen");
	}
}

class Library{
	
	ArrayList<String> books = new ArrayList<String>();

	public List<String> getBooks() {
		return Collections.unmodifiableList(books);
	}

	public void addBook(String book){
		books.add(book);
	}
	
}

运行一下,结果报出如下错误:

Exception in thread "main" java.lang.UnsupportedOperationException

很好,这下想直接操作list集合不行了,只能老老实实的调用addBook()方法,一本本地添加了。






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Collections.unmodifiableList方法的使用与场景

在公司接触到Collections.unmodifiableList(List list)) 觉得用法挺特殊的,所以学习了下,简单而言,看名字就知道,将参数中的List返回一个不可修改的List. ...
  • cilen
  • cilen
  • 2012年07月13日 18:06
  • 25145

Collections.unmodifiableList方法的使用与场景

在公司接触到Collections.unmodifiableList(List list)) 觉得用法挺特殊的,所以学习了下,简单而言,看名字就知道,将参数中的List返回一个不可修改的List. ...
  • kjfcpua
  • kjfcpua
  • 2013年01月28日 13:32
  • 5052

java.util.Collections.unmodifiableList()方法实例

unmodifiableList() 方法用于返回指定列表的不可修改视图。 声明: public static List unmodifiableList(List list)参数:list--...

Collections.unmodifiableList()用法

在《重构——改善既有代码的设计》一书中,有一种重构手法叫Encapsulate Collection (封装集群),为了演示该重构手法,我写了四个类,通过对比重构前后的代码,加深对 这一重构手法的...
  • wj_j2ee
  • wj_j2ee
  • 2012年12月21日 10:35
  • 3551

Collections.unmodifiableList方法的使用与场景

在公司接触到Collections.unmodifiableList(List

[Android]Collections.unmodifiableList方法的使用与场景

在公司接触到Collections.unmodifiableList(Listpackage com.readonlylist;import Java.util.ArrayList;public cl...

java 集合中的Collections.sort()排序方法的源码分析(一)

Collections.sort()方法 是用来对 List 进行排序的,主要有两种方式。  本文主要讨论 List 中的对象继承Comparable接口,并实现 接口中的 compareTo 方法这...

Collections 随机排序方法Shuffle源码说明

import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.R...
  • tanksyg
  • tanksyg
  • 2015年11月19日 14:45
  • 1373

读《重构》,学习Collections.unmodifiableList()用法

在《重构——改善既有代码的设计》一书中,有一种重构手法叫Encapsulate Collection (封装集群),为了演示该重构手法,我写了四个类,通过对比重构前后的代码,加深对 这一重构手法的...

OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法

本篇主要讲解java.util.Arrays这个针对数组的工具类。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Retrofit源码研究之Collections类的unmodifiableList()方法
举报原因:
原因补充:

(最多只允许输入30个字)