我正在尝试确定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); }
我的问题:
在应用程序中使用哪个最有意义?[doSomethingOne和getFooOne]或[doSomethingTwo和fooTwo]?换句话说,如果您知道您正在使用ImmutableCollections,那么继续来回转换并执行copyOf()是否有意义,还是仅在各处使用Immutable?
这些示例是公共方法,可能暗示其他人使用它们。如果方法是私有的并且在内部使用,这些答案中的任何一个都会改变吗?
如果用户尝试将任何内容添加到不可变列表,则将引发异常。因为他们可能不知道这一点,所以显式返回ImmutableCollection而不是Collection会更有意义吗?
通常,明智的做法是不要在声明的返回类型中提交特定的实现,但是我们将不可变类型视为例外。有几种理由声明返回类型为Immutable*:
Immutable*
null
asList()
reverse()
copyOf()
基本上,我只是从https://github.com/google/guava/wiki/TenThingsAboutImmutableCollections爬来爬去,您可能想要完整检查一下。