当前位置: 首页 > 面试题库 >

使用番石榴不可变集合作为方法参数和/或返回类型

蒋弘致
2023-03-14
问题内容

我正在尝试确定ImmutableList的最佳做法。下面是一个简单的示例,将有助于提出我的问题:

例如:

public ImmutableCollection<Foo> getFooOne(ImmutableList<Foo> fooInput){ 
   //.. do some work
   ImmutableList<Foo> fooOther = // something generated during the code
   return fooOther;
}

public Collection<Foo> getFooTwo(List<Foo> fooInput){
   //.. do some work
   List<Foo> fooOther = // something generated during the code
   return ImmutableList.copyOf(fooOther);
}

public void doSomethingOne(){
  ImmutableCollection<Foo> myFoo = getFooOne(myList);
  ...
  someOtherMethod(myFoo);
}

public void doSomethingTwo(){
  Collection<Foo> myFoo = getFooOne(myList);
  ...
  someOtherMethod(myFoo);
}

我的问题:

  1. 在应用程序中使用哪个最有意义?[doSomethingOne和getFooOne]或[doSomethingTwo和fooTwo]?换句话说,如果您知道您正在使用ImmutableCollections,那么继续来回转换并执行copyOf()是否有意义,还是仅在各处使用Immutable?

  2. 这些示例是公共方法,可能暗示其他人使用它们。如果方法是私有的并且在内部使用,这些答案中的任何一个都会改变吗?

  3. 如果用户尝试将任何内容添加到不可变列表,则将引发异常。因为他们可能不知道这一点,所以显式返回ImmutableCollection而不是Collection会更有意义吗?


问题答案:

通常,明智的做法是不要在声明的返回类型中提交特定的实现,但是我们将不可变类型视为例外。有几种理由声明返回类型为Immutable*

  • 他们记录您返回的是快照,而不是实时视图。
  • 他们记录了调用者无法更改结果。
  • 他们记录了插入顺序被保留(在您的用例中可能重要,也可能不重要)。
  • 他们记录了该集合将不包含null
  • 有人可能想要asList()or reverse()方法。
  • 如果某人copyOf()希望分配给某个Immutable*字段,则可以节省他的电话。(但是请注意,如果他确实包含了copyOf(),即使您未声明返回类型,它也会使大多数不可变的输入短路。)

基本上,我只是从https://github.com/google/guava/wiki/TenThingsAboutImmutableCollections爬来爬去,您可能想要完整检查一下。



 类似资料:
  • 我非常喜欢Java8流和Guava的不可变集合,但我不知道如何将两者结合使用。 例如,如何实现将流结果收集到不可变多映射中的Java 8收集器? 奖励点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式。

  • 问题内容: 我有一个带有参数的方法,该参数可以为NULL。我想将输入的本地副本作为结束。现在,我的代码如下所示: 有没有更清洁的方法可以做到这一点?如果是一个简单的参数,我可以做类似的事情,但是我不确定是否有类似处理集合的事情。 问题答案: 我不明白为什么您不能使用: 您可以使用静态导入保存某些类型的输入,如果您要这样做的话:

  • 问题内容: 我已经使用番石榴已有一段时间了,并且对此感到非常信任,直到昨天我偶然发现了一个例子,这让我开始思考。长话短说,这里是: 运行此命令后,您可以看到 ImmutableList 内部的条目的值已更改。如果此处涉及两个线程,则一个线程可能碰巧看不到另一个线程的更新。 同样令我非常不耐烦的是,Effective Java中的Item15,第5点说: 在构造函数中制作防御程序副本 -看起来很合理

  • 问题内容: 我有一个字符串集合,我想将其转换为全部为空或为null的字符串集合,并删除所有字符串,并修剪所有其他字符串。 我可以分两步来做: 但是,是否有番石榴方法将两个动作组合为一个步骤? 问题答案: 在 即将发布的 最新版本的Guava(12.0)中,将有一个名为FluentIterable的类。此类为此类内容提供了缺少的流畅API。 使用FluentIterable,您应该可以执行以下操作:

  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 问题内容: 从Effective Java Second Edition的第28项开始:“不要将通配符类型用作返回类型。与其为用户提供额外的灵活性,不如将其强制在客户端代码中使用通配符类型。” 我刚开始接触通用通配符,以了解我在编写的一段代码中最后一次未经检查的强制转换警告,而且我不明白为什么getRawType()返回通配符类型。 我必须转换token.getRawType()因为它返回一个 问