关闭

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

452人阅读 评论(0) 收藏 举报



在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()方法,一本本地添加了。






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16759次
    • 积分:481
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:1篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论