Collections类中静态final字段的目的是什么?

时间:2014-12-08 14:36:59

标签: java collections

Collections类有三个静态最终字段,分别名为EMPTY_LIST,EMPTY_MAP和EMPTY_SET。它们都是接口引用,它们是最终的。那他们的目的是什么?

4 个答案:

答案 0 :(得分:4)

引用JDK7源代码,例如:

/**
 * Returns the empty set (immutable).  This set is serializable.
 * Unlike the like-named field, this method is parameterized.
 *
 * <p>This example illustrates the type-safe way to obtain an empty set:
 * <pre>
 *     Set&lt;String&gt; s = Collections.emptySet();
 * </pre>
 * Implementation note:  Implementations of this method need not
 * create a separate <tt>Set</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_SET
 * @since 1.5
 */
@SuppressWarnings("unchecked")
public static final <T> Set<T> emptySet() {
    return (Set<T>) EMPTY_SET;
}

那应该回答你的问题。他们甚至在Collections JavaDoc中提到它是不可变的,因此只有一个,因此static是安全的。

干杯,

答案 1 :(得分:3)

目的是您不需要构造不可变空数据结构的新实例。您可以简单地重用现有的。这些领域是在Generics之前引入的。对于泛型,您希望使用访问器方法,因为它们以泛型方式是类型安全的。即而不是Collections.EMPTY_SET您要使用Collections.emptySet()。字段不能声明类型参数,但方法可以。

这是一个空集合派上用场的例子。

假设你有一个函数返回一个整数列表的总和,你想测试当你传递空列表时,它会返回0.测试看起来像这样:

public class IntSumTest {
    @Test
    public void givenEmptyList_whenSumming_thenReturnsZero() {
        assertEquals(0, sum(Collections.emptyList());
    }
}

我很少在测试类之外使用空集合,所以我还没想到另一个例子。

答案 2 :(得分:2)

它们是Collections.empty{List,Map,Set}()返回的值。

由于javadoc指定这些方法返回的所有元素都是不可变的,因此任何时候都不能有多个元素;)

答案 3 :(得分:2)

符合最佳实践的API永远不会有一个返回集合的方法返回null。如果没有要返回的项目,则应返回空集合。

此外,在调用某些不容忍null的API时,您可能会有一个可能null的集合引用,您必须将其转换为始终为非空的。< / p>

在所有这些情况下,整体应用程序性能最好重用一个表示不可变空集合的实例,而不是浪费时间和内存,每次创建一个新实例。 JDK为您提供了这样的单身。