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



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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值