【问题标题】:How do you decide whether to return Optional.empty() or Collections.emptyList()?你如何决定是返回 Optional.empty() 还是 Collections.emptyList()?
【发布时间】:2022-01-22 11:21:27
【问题描述】:

我了解返回可选项会对性能产生影响。我知道返回空集合也可能会损害性能,但可以通过返回不可变的空集合(例如 Collections.emptyList())来避免这种情况。 在决定选择哪个时还应考虑哪些其他因素。

【问题讨论】:

  • Sam,“在决定选择哪个时,还应考虑哪些其他因素。”在本论坛中将被视为一个有效问题过于宽泛/模糊。
  • 为什么 List 是可选值?我希望你没有使用 Optional 来指示错误;这就是例外。
  • 重要的问题是,你的方法通常是做什么的,即当返回值不为空的时候?

标签: java list performance optional


【解决方案1】:

对于绝大多数使用而言,Optional 和 Empty-List 之间的任何性能问题都完全可以忽略不计。停止专注于此类问题,因为过早尝试在此级别进行优化总是会导致比任何实际收益更多的问题(难以维护代码等)。

一个更深层次的问题是,为什么您认为这两个选项实际上是等价的。

Optional 最好用于捕获单个对象是否已返回。

列表显然会返回许多对象。

我个人的看法是,由于“数字”显然包含零,所以我返回一个空列表没有问题,相反,我很难证明 IMHO 过度设计的返回 Optional 的想法是正确的。通过测试“list.isEmpty()”和/或沿着该列表进行迭代(或流)的有效无操作,没有什么比这更丑陋的构造提供的更干净了。

【讨论】:

  • 我同意。 Optional<List<Whatever>> 很少是一个好的设计。如果有零个项目,则返回一个包含零个项目的列表。
【解决方案2】:

很难想象一个 JVM 应用程序在该级别上的性能开销很重要。也许如果你构建超级基础的基本组件,比如 List 本身的实现,它只建立在原始的 java 类型上,或者一些序列化框架在不安全的领域制造了疯狂的特技。

据我所知, optional.empty() 和 Collections.emptyList() 都是常量,因此没有性能开销。是的,强大的消息来源也证实了这一点:

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

在决定选择哪个时还应考虑哪些其他因素。

我通常不太喜欢编码哲学,但 Optional 说更多“可能有什么或什么都没有”,但一个空列表说“好吧,它无论如何都是一个列表,大小为零”。请注意,常量 EMPTY_LIST 是不可变的,你不能往里面放任何东西。

我认为,碰巧我确实将列表放入了可选项中以指示一些“那里什么都没有”或“根本不适用”,这会导致创建可选对象的微小开销。但我怀疑,您是否会找到一个合理的应用程序,从而产生有意义的差异。我确实同意@racraman 的观点,即Optional&lt;List&gt; 看起来很奇怪,并且表明一些最初不应该存在的退化案例。不过,不知道关于这个细节的普遍共识是什么。

例如here's 一个主题的讨论声称使用 Optional 不是可选的,当回避的替代方法是返回 null 时。它还详细介绍了 Optional 的界面及其用例。例如,出现样式问题,其中 Optional 允许“更实用”fluent coding style 目前似乎很流行。

如果您确实关心该级别的性能,您可能不应该关心,这本身就是一个完整的主题,请参阅例如this 相关文章。由于在这种情况下可能出现分支错误预测,因此在现代 cpu 上,使用其流畅接口的 Optional 可能会优于条件(“if”)。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多