小编典典

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

java

我正在尝试确定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会更有意义吗?


阅读 210

收藏
2020-11-13

共1个答案

小编典典

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

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

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

2020-11-13