【问题标题】:List.of() or Collections.emptyList()List.of() 或 Collections.emptyList()
【发布时间】:2016-09-08 21:08:59
【问题描述】:

作为List.of(...) or Collections.unmodifiableList() 的一个特例——Java 9 指向不可变 列表的首选方式是什么?

继续写

Collections.emptyList();

或切换到

List.of();

【问题讨论】:

  • Close voter(s):我几乎投票给主要意见,但是有两个客观原因更喜欢emptyList(),而我想不出更喜欢List.of(),这似乎使主题。

标签: java collections java-9


【解决方案1】:

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

差异相当微妙,因此“首选”取决于您想要实现的目标。一些行为差异:

  • List.of 将在 contains(null) 调用上引发异常。
  • 您可以在 JDK 8 及更早版本上反序列化 emptyList(),但不能反序列化 List.of

就或传达您想要一个空列表而言,emptyList() 可能看起来更好,但这只是一个临时约定。如果开发人员开始使用List.of()(比Collections.emptyList() 短得多),那么它将成为一种已知和接受的方式,它只是新的。如果你仔细想想,我们使用的一些结构并不总是能传达它们本身的作用,但我们已经习惯了它们。

所以没有严格的首选方式。如果行为无关紧要,请随意使用。

【讨论】:

  • 这个问题及其接受的答案(由作者评论)已有 1 年以上的历史。
  • @Sormuras 我很清楚,所以呢?人们希望在阅读问题时看到更新的信息。问题不会在本网站上过期,只要有解决问题中问题的新方法,它们就会更新为新答案。
  • 很公平。您在已接受答案下方的其他评论隐藏在“显示更多”链接后面。
  • @Sormuras:as explicitly stated:“接受一个答案并不意味着该问题现在已经得到完美回答的明确和最终声明”......你可以接受顺便说一句,如果它更适合或旧的答案已经过时,则提供更新的答案。
  • contains(null) 位是非常相关的...不可变对象的构造函数也喜欢null 安全性通常会对传入的集合进行contains(null) 检查,以保证其用户他们在浏览提供的集合时不会遇到null。当使用List.of 创建集合时,这会引发 NPE,真的很烦人。构造函数中的 null 检查现在必须是 collection.stream().filter(Objects::isNull).findAny().isPresent() 行中的内容
【解决方案2】:
  1. emptyList() 创建一个新的空列表实例仅一次
  2. 可读性没有区别:可能List.of()Collections.emptyList() 更短,但您可以使用import static java.util.Collections.emptyList; 之类的静态导入,然后只写入emptyList()

【讨论】:

  • 实际上我已经这样做了很长时间,有些人可能会争辩说你可以用import static java.util.List.of; 做同样的事情,尽管这样可读性较差......谢谢!
【解决方案3】:

Collections.emptyList()不需要每次调用都创建一个新对象;这是典型的,as in OpenJDK,只返回单例EMPTY_LIST 对象。此外,更清楚的是,您打算表示一个空列表,而不是忘记填写占位符。

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

【讨论】:

  • @Andreas 其实,没关系;它仍在创建一个新的空占位符。
  • @Andreas List.of() 不能每次都返回相同的实例没有内在的原因。只是还没有实施。见JDK-8156079。也就是说,权衡并不总是显而易见的。使用缓存实例可能会总体上节省内存,但也会阻止 JIT 进行某些优化。自动装箱缓存肯定会发生这种情况。 List.of() 不调用Collections.emptyList() 的原因是后者有一个明确定义的序列形式,出于兼容性原因无法更改。新...
  • @Sormuras ... 集合工厂都共享一个通用的序列格式(序列化代理),如果我们将来想要更改内部结构,这将更容易。此外,emptyList() 在调用 mutator 方法时的行为稍微宽松一些。例如,emptyList().addAll(emptyList()) 是空操作,但 List.of().addAll(emptyList()) 会抛出 UnsupportedOperationException
  • 我已修复 JDK-8156079,以便在 JDK 9 早期访问版本 144 及更高版本中,List.of()Set.of()Map.of() 对空实例使用单例。
  • emptyList() 并不快,List.of()“也不需要为每个调用创建一个新对象”。答案已经过时了。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2011-09-26
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多