如果我有一个列表,并且我希望有一个方法返回列表而不暴露实际列表本身,那么最好的方法是什么?
public class open {
private List<Open> users;
public open() {
this.users = new ArrayList<Open>();
}
public List<Open> getUsers() {
//return a copy of the list}
所以基本上我需要列表的副本......我猜测使用迭代器可能是要走的路,但有没有更有效的方法呢?
答案 0 :(得分:4)
有很多选择。
您可以使用复制构造函数:
return new ArrayList<>(users);
这将明确复制List
并返回副本。我不推荐这个,除非你真的需要一个可变副本 - 显然是O(n)
。
一种更有效的方法是使用Collections
实用程序类,这提供了一种返回不可变视图的方法:
return Collections.unmodifiableList(users);
由于这是一个视图,因此返回方法为O(1)
而不是O(n)
,因此效率更高。它涉及确保您无法通过List
&amp;修改add
。 remove
等,也不是通过Iterator.remove
。
答案 1 :(得分:3)
无需创建列表副本。您可以使用Collections.unmodifiableList
返回列表的不可修改的视图。
return Collections.unmodifiableList(users);