问题 List.of()或Collections.emptyList()


作为一个特例 List.of(...)或Collections.unmodifiableList()  - 什么是指向一个首选的Java 9方式  和 一成不变 清单?

继续写

Collections.emptyList();

或切换到

List.of();

12243
2017-09-08 21:08


起源

关闭选民:我几乎投票支持主要意见,但有两个客观原因需要 emptyList() 没有我能想到的更喜欢 List.of(),这似乎使这个主题。 - chrylis


答案:


指向空且不可变列表的首选Java 9方法是什么?

差异是相当微妙的,所以“首选”取决于你想要达到的目标。一些行为差异:

  • List.of 将抛出异常 contains(null) 如果那些因某些奇怪的原因而发生的调用。
  • 您可以反序列化 emptyList() 在JDK 8和之前,但不是 List.of

在表达或传达你想要一个空列表, emptyList() 可能看起来更好,但这只是一个临时约定。如果开发者开始使用 List.of() (比短得多 Collections.emptyList()那么它将成为一种已知和被接受的方式,它只是新的。如果你考虑一下,我们使用的一些结构并不能总是传达他们自己做的事情,但我们已经习惯了它们。

所以没有严格的首选方式。如果行为无关紧要,请使用您想要的任何内容。


0
2017-10-07 11:41



这个问题及其接受的答案(作者评论)是1岁以上。 - Sormuras
@Sormuras我很清楚,所以?人们希望在阅读问题时看到更新的信息。问题不会在此网站上老化,只要有新方法可以解决问题中的问题,问题就会更新。 - user1803551
很公平。您接受的答案下面的其他评论隐藏在“显示更多”链接后面。 - Sormuras
@Sormuras: 如明确说明:“接受答案并不意味着是一个明确的最终陈述,表明现在已经完全回答了这个问题“...如果它更适合或者老年人已经过时,你可以接受一个更新的答案。顺便说一下。 - Holger


Collections.emptyList() 不需要为每个调用创建一个新对象;这是典型的, 就像在OpenJDK中一样,只是返回单身人士 EMPTY_LIST 目的。此外,您打算更清楚 意思 一个空列表,而不是忘记填写占位符。

使用 emptyList();它更快(达到Java目标级别1.9)并且更具可读性。


12
2017-09-08 21:14



@Andreas实际上,没关系;它仍在创建一个新的空占位符。 - chrylis
它是,但你可能想知道 为什么  List.of() 不只是打电话 Collections.emptyList()。我没有看过那里是否有任何讨论,但我想这是为了确保你总是得到一个 新 列表,用于单独实例重要的情况。所以,你新的实例很重要,请使用 List.of()。如果你不在乎,请使用 Collections.emptyList()正如你已经说过的那样,它也更好地描述了目的。 - Andreas
@Andreas没有内在的原因 List.of() 每次都无法返回相同的实例。它还没有实现。看到 JDK-8156079。也就是说,权衡并不总是显而易见的。使用缓存实例可能会整体节省内存,但它也会阻止JIT进行某些优化。这肯定发生在自动装箱缓存上。原因 List.of() 不打电话 Collections.emptyList() 是后者有一个明确定义的序列形式,出于兼容性原因无法更改。新的... - Stuart Marks
@Sormuras ...集合工厂都共享一个通用的串行格式(序列化代理),如果我们希望将来更容易更改内部结构。也, emptyList() 调用mutator方法时,行为稍微松懈。例如, emptyList().addAll(emptyList()) 是一个无操作,但是 List.of().addAll(emptyList()) 投 UnsupportedOperationException。 - Stuart Marks
我修好了 JDK-8156079 这样在JDK 9中早期访问构建144及更高版本, List.of(), Set.of(),和 Map.of() 将单例用于空实例。 - Stuart Marks