11

可能重复:
Collections.emptyList() 与新实例

我试图了解使用以下方法创建列表的新实例之间的区别:

new ArrayList<X>

Collections.emptyList();

据我了解,后者返回一个不可变列表。这意味着无法添加、删除或修改它。我想知道为什么要创建和不可变的 emptyList ?有什么用?谢谢

4

5 回答 5

15

不可变允许可重用​​实例。

Collections.emptyList 将始终返回完全相同的单例实例。

这是非常有效的。

除此之外,不可变数据可以在线程之间安全地共享,并保证避免由于编码错误导致的奇怪副作用。出于这个原因,它也使防御性副本变得不必要。

于 2012-09-26T08:11:43.527 回答
14

假设您必须返回一个集合,并且您不想每次都创建几个对象。

interface Configurable {
    List<String> getConfigurationList();
}

// class which doesn't have any configuration
class SimpleConfigurable implements Configurable {
    public List<String> getConfigurationList() { return Collections.emptyList(); }
}

返回一个空集合通常比返回更可取null

于 2012-09-26T08:12:08.160 回答
8

我经常使用空列表作为Null 对象:这避免了检查null

于 2012-09-26T08:12:00.547 回答
6

我已经使用Collections.emptyList了返回列表但使用没有意义的参数调用的方法。

例如,您想要访问流的不同部分的流处理应用程序,可能基于日期。您从流中查询项目的时间跨度,但如果在该时间跨度内没有项目,您将返回一个空列表。抛出异常没有任何意义,因为查询没有任何问题。返回null也没有多大意义,因为所有调用代码都需要检查null.

返回一个不可变的空列表允许调用代码很好地处理返回值,您无需担心线程问题,因为不可变列表本质上是线程安全的。

于 2012-09-26T08:13:31.407 回答
4

避免不需要的 NullPointerException。

在您的代码中,您可能会返回一个普通的“空”ArrayList 而不是返回 null。但是,这样一来,您将在每次执行时继续创建新对象(默认容量为 10),这不是一种内存高效的方法。相反,如果您返回 emptyList,则每次调用都将返回相同的实例。这样,它以更有效的方式将您从不需要的 NullPointerException 中拯救出来。以下是 emptyList 的 Javadoc 的片段:

/**
 * Returns the empty list (immutable).  This list is serializable.
 *
 * <p>This example illustrates the type-safe way to obtain an empty list:
 * <pre>
 *     List&lt;String&gt; 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
 */
于 2012-09-26T08:55:14.800 回答