Collections类有三个静态最终字段,分别名为EMPTY_LIST,EMPTY_MAP和EMPTY_SET。它们都是接口引用,它们是最终的。那他们的目的是什么?
答案 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<String> 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为您提供了这样的单身。