【问题标题】:Passing an immutable list to ImmutableList.copyOf()?将不可变列表传递给 ImmutableList.copyOf()?
【发布时间】:2016-04-14 17:19:19
【问题描述】:

我有以下代码:

private static final ImmutableMultimap<String, String> namesToAddress;

public static List<String> getAddresses(String name){
  return ImmutableList.copyOf(namesToAddress.get(name));
}

我的问题是这里的防御性 copyOf() 是否必要,因为 get() 无论如何都会返回一个不可变的列表?

注意我使用的是来自 Google Guava 的 ImmutableMultiimap。

谢谢。

【问题讨论】:

  • ImmutableMultimap#get 返回一个ImmutableCollection。没有必要复制它。但是,如果您需要List...
  • 在 Google Guava 文档中 (docs.guava-libraries.googlecode.com/git/javadoc/com/google/…) 它声明 mmutableMultimap#get 返回一个 ImmutableList...
  • 另外,ImmutableList.copyOf 无论如何也不会真正复制ImmutableList
  • @user1974753 你正在查看ImmutableListMultimap,但你的代码有ImmutableMultimap。无论如何,它们都是不可变的。

标签: java guava immutability defensive-copy


【解决方案1】:

一些事情(主要包含在 cmets 中,但作为答案):

  • 如果您使用ImmutableListMultimap 作为namesToAddresses 的类型,get() 将返回一个ImmutableList;无需致电copyOf 或演员或其他任何事情
  • 即使你不这样做,ImmutableMultimap.get() 也会返回一个ImmutableCollectionImmutableCollections 有一个 asList() 方法来查看(或在必要时复制)集合为 ImmutableList
  • 无论如何,调用 ImmutableList.copyOf(ImmutableCollection) 最终会在集合上调用 asList()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2016-12-05
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多