我正在编写一个将在多个地方使用的库方法。方法的参数之一是对象的集合,并且该方法不会对该集合进行突变。方法签名应该指定可变或不可变的集合吗?
public static void foo(List<Bar> list) {
// ...
}
优点:客户可以通过List<Bar>
或ImmutableList<Bar>
中的任何一个对他们来说更方便。
缺点:list
参数不会被突变并不是立即显而易见的。客户必须阅读文档和/或代码以实现此目的。客户仍然可以制作不必要的防御性副本。
public static void foo(ImmutableList<Bar> list) {
// ...
}
优点:客户端保证list
参数不会被突变。
缺点:如果客户端具有List<Bar>
,则必须先将其转换为ImmutableList<Bar>
,然后再调用foo
。这种转换浪费了少量时间,无论客户是否愿意,它都会强迫。
注:出于这个问题的目的,我们假设所有客户端都具有可用的Guava的ImmutableList
,例如,因为库和客户端代码都属于在其他地方已经使用ImmutableList
的同一代码库。
我正在编写一个将在多个地方使用的库方法。方法的参数之一是对象的集合,并且该方法不会对该集合进行突变。方法签名是否应该...
我会坚持列出来,您不知道可被枚举的集合是否将完全实现Java接口。就您而言,ImmutableList是Guava接口。也许此方法的客户端将没有可用的番石榴。
作为foo()
API的创建者,这与您无关。您获取了一个列表,并且没有对其进行修改,仅此而已。