我试图理解使用以下方法创建列表的新实例之间的区别:
new ArrayList<X>
和
Collections.emptyList();
据我所知,后者返回一个不可变列表。这意味着无法添加,删除或修改它。 我想知道为什么会创建和不可变的emptyList?有什么用? 感谢
答案 0 :(得分:13)
不可变允许可重用的实例。
Collections.emptyList将始终返回完全相同的单例实例。
这非常有效。
除此之外,可以在线程之间安全地共享不可变数据,并保证避免由于编码错误而产生的奇怪副作用。因此,它也不需要防御性副本。
答案 1 :(得分:13)
假设您必须返回一个集合,并且您不希望每次都创建几个对象。
interface Configurable {
List<String> getConfigurationList();
}
// class which doesn't have any configuration
class SimpleConfigurable implements Configurable {
public List<String> getConfigurationList() { return Collections.emptyList(); }
}
返回空集合通常比返回null
答案 2 :(得分:7)
我经常将空列表用作Null objects:这样可以避免检查null
。
答案 3 :(得分:5)
我已经将Collections.emptyList
用于返回列表的方法,但是使用没有意义的参数调用它们。
例如,您可能希望根据日期访问流的不同部分的流处理应用程序。您从流中查询项目的时间跨度,但如果该时间跨度中没有项目,则返回空列表。抛出异常没有任何意义,因为查询没有任何问题。返回null
也没有多大意义,因为所有调用代码都需要检查null
。
返回一个不可变的空列表允许调用代码很好地处理返回值,你不需要担心线程问题,因为不可变列表本质上是线程安全的。
答案 4 :(得分:3)
避免不需要的NullPointerException。
在您的代码中,您可以返回正常的“空”ArrayList,而不是返回null。但是,通过这种方式,您将在每次执行时继续创建新对象(默认容量为10),这不是一种内存有效的方法。如果返回emptyList,则会在每次调用时返回相同的实例。这样,它可以更有效地避免不必要的NullPointerException。这是来自Javadoc for emptyList的剪辑:
/**
* Returns the empty list (immutable). This list is serializable.
*
* <p>This example illustrates the type-safe way to obtain an empty list:
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
* Implementation note: Implementations of this method need not
* create a separate <tt>List</tt> object for each call. Using this
* method is likely to have comparable cost to using the like-named
* field. (Unlike this method, the field does not provide type safety.)
*
* @see #EMPTY_LIST
* @since 1.5
*/