【问题标题】:More succinct code for a defensive copy using Guava's immutable types?使用 Guava 的不可变类型的防御性副本更简洁的代码?
【发布时间】:2020-07-10 13:32:23
【问题描述】:

我想制作一个使用 Guava 的不可变类型传递给方法的集合的防御性副本,例如一个ImmutableList。我还必须能够处理null 输入并将其视为空集合。

我能想到的最干净的是:

  public void setStrings(List<String> strings) {
     this.strings = strings == null ? ImmutableList.of() : ImmutableList.copyOf(strings);
  }

有没有更易读的东西,最好没有三元运算符?由于我与this answer 分享的原因,我不会将Optional.of(strings).map(...).orElse(...) 视为一个不错的选择。

【问题讨论】:

  • 我认为您当前的代码没有任何问题,除了您可能首先传入null
  • 这是 Jackson 用于反序列化 JSON 的 DTO 中的代码。该接口有点模糊,因此应该可以传入空数组或null 并应用相同的语义。因此,很遗憾,这超出了我的控制范围。
  • 那么我看不出你当前的代码有什么问题:)

标签: java coding-style guava defensive-copy


【解决方案1】:

你可以使用MoreObjects.firstNonNull,同样来自Guava:

public void setStrings(List<String> strings) {
     this.strings = ImmutableList.copyOf(MoreObjects.firstNonNull(strings, Collections.emptyList()));
}

另外,ListUtils.emptyIfNull 是 Apache Commons Collections 中类似但更专业的方法,我认为它更清晰、更易于阅读:

public void setStrings(List<String> strings) {
     this.strings = ImmutableList.copyOf(ListUtils.emptyIfNull(strings));
}

【讨论】:

  • 您可以坚持使用ImmutableList.of() 而不是Collections.emptyList() - 如果它已经是ImmutableListcopyOf 会避免创建副本。
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2012-08-13
  • 2011-02-26
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多