将可变或不可变集合作为方法参数首选

问题描述 投票:2回答:2

我正在编写一个将在多个地方使用的库方法。方法的参数之一是对象的集合,并且该方法不会对该集合进行突变。方法签名应该指定可变或不可变的集合吗?

选项1:可变集合作为参数

public static void foo(List<Bar> list) {
  // ...
}

优点:客户可以通过List<Bar>ImmutableList<Bar>中的任何一个对他们来说更方便。

缺点:list参数不会被突变并不是立即显而易见的。客户必须阅读文档和/或代码以实现此目的。客户仍然可以制作不必要的防御性副本。

选项2:将不可变集合作为参数

public static void foo(ImmutableList<Bar> list) {
  // ...
}

优点:客户端保证list参数不会被突变。

缺点:如果客户端具有List<Bar>,则必须先将其转换为ImmutableList<Bar>,然后再调用foo。这种转换浪费了少量时间,无论客户是否愿意,它都会强迫


注:出于这个问题的目的,我们假设所有客户端都具有可用的Guava的ImmutableList,例如,因为库和客户端代码都属于在其他地方已经使用ImmutableList的同一代码库。

我正在编写一个将在多个地方使用的库方法。方法的参数之一是对象的集合,并且该方法不会对该集合进行突变。方法签名是否应该...

java immutability
2个回答
0
投票

我会坚持列出来,您不知道可被枚举的集合是否将完全实现Java接口。就您而言,ImmutableList是Guava接口。也许此方法的客户端将没有可用的番石榴。


0
投票

作为foo() API的创建者,这与您无关。您获取了一个列表,并且没有对其进行修改,仅此而已。

© www.soinside.com 2019 - 2024. All rights reserved.