Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections类中静态final字段背后的用途是什么?_Java_Collections - Fatal编程技术网

Java Collections类中静态final字段背后的用途是什么?

Java Collections类中静态final字段背后的用途是什么?,java,collections,Java,Collections,Collections类有三个静态的final字段,分别称为EMPTY_LIST、EMPTY_MAP和EMPTY_SET。它们都是接口引用,并且是最终的。那么他们的目的是什么呢?引用JDK7来源,例如: /** * Returns the empty set (immutable). This set is serializable. * Unlike the like-named field, this method is parameterized. * * <p>Th

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

引用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;
}
/**
*返回空集(不可变)。此集合可序列化。
*与类似的命名字段不同,此方法是参数化的。
*
*此示例说明了获取空集的类型安全方法:
* 
*SetString s=Collections.emptySet();
* 
*实现说明:此方法的实现不需要
*为每个调用创建一个单独的Set对象。用这个
*该方法的成本可能与使用类似的命名方法相当
*场。(与此方法不同,该字段不提供类型安全。)
*
*@见#空(套)
*@自1.5
*/
@抑制警告(“未选中”)
公共静态最终集清空集(){
返回(集合)空集合;
}
这应该能回答你的问题。它们甚至在中提到是不可变的,因此只有一个是安全的,因此
是静态的


干杯,

它们是
集合返回的值。空{List,Map,Set}()


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

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

下面是一个空集合派上用场的示例

让我们假设您有一个函数,它返回整数列表的和,您想测试当您传递空列表时,它返回0。测试如下所示:


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

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

此外,当调用一些不允许
null
s的API时,您可能有一个
null
集合引用,您必须将其转换为一个始终非null的集合引用


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

问题在于常量,而不是方法。我想OP会更想知道为什么需要另一个方法来返回那个常量。您回答了第二个问题,但根本没有回答OP的问题。文档和源文件都清楚地显示了字段的用途,因此在我看来,没有比这更明确的答案了。@Gimby如果您暗示字段是用于这些方法的,那么您的答案是颠倒的。方法是为了让字段更有用,字段本身就是公共API。我不打算讨论这个问题,我同意不同意。@Gimby没有什么不同意的,真的,考虑到字段在添加方法之前有几个版本。谢谢你的解释,但是我仍然不理解对空的不可变集的接口引用的需要。。你会用它做什么?你会在任何需要空集合的地方使用它,而不需要它是可变的。再说一遍,你能给我一个具体的例子说明如何使用空不可变集合吗?@MarkoTopolnik谢谢,我想我现在明白了。@ChristianHujer,我想我现在明白了。谢谢。我之前发布了一个回复,询问您何时需要不可变的空引用的具体示例,但是重新阅读您的回复,我想我理解了。谢谢你的解释。我有一个后续问题-这三个空接口引用,它们指向什么对象?例如,引用EMPTY_LIST是否指向没有元素的列表类型的实例化对象?如果是这样的话,这个对象的具体类是什么?您可以在实际的OpenJDK源代码上轻松地验证这一点,以及更多。在IDE中,
空列表的“转到声明”。如果不可用,请在谷歌上搜索“grepcodejavacollections”,并在grepcode网站上找到collections类的链接。
public class IntSumTest {
    @Test
    public void givenEmptyList_whenSumming_thenReturnsZero() {
        assertEquals(0, sum(Collections.emptyList());
    }
}