等价方法超载为什么有必要?

我浏览了Google制作的一些JAVA代码,我发现了ImmutableSet: http : //google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

他们用其他几种方法实现了of()方法:

public static  ImmutableSet of(E e1, E e2); public static  ImmutableSet of(E e1, E e2, E e3); public static  ImmutableSet of(E e1, E e2, E e3, E e4); public static  ImmutableSet of(E e1, E e2, E e3, E e4, E e5); public static  ImmutableSet of(E... elements); 

我查看了此处的实施: https : //code.google.com/p/google-collections/source/browse/trunk/src/com/google/common/collect/ImmutableSet.java

有一个创建方法,具有以下签名:

 private static  ImmutableSet create(E... elements) 

包裹了

 private static  ImmutableSet create(Iterable iterable, int count); 

方法。 public方法只是将参数传递给create(E … elements)signatured方法,该方法最终调用另一个create方法。

我想由于我们有(E … elements)方法,因此不需要公开具有固定计数参数的方法。

我的问题是他们为什么这样做呢? 性能? 或者这是一种模式?

谢谢。

它实际上与性能无关:所有方法都委托给相同的创建方法,无论如何都需要数组。

我的猜测是它与警告有关。 考虑以下最小代码段:

 import java.util.List; class ImmutableSet { } public class ParametersTest { public static void main(String[] args) { List list0 = null; List list1 = null; of(list0, list1); } @SuppressWarnings("unchecked") public static  ImmutableSet of(E e1, E e2) { return create(e1, e2); } public static  ImmutableSet of(E... elements) { return create(elements); } private static  ImmutableSet create(E... elements) { return null; } } 

在main方法中调用of是很好的:它匹配方法的2-args-version。 现在注释掉-method的2-args版本。 然后调用仍然正常,但会直接调用varags版本。 这将导致创建通用数组,并导致警告。 (显然,这个警告在2-args版本中被抑制)。

总而言之,我认为这是为了避免对想要使用generics类型的多个对象调用方法的库的客户端发出警告。

幸运的是,感谢http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html ,将来不再需要这样的事情了。

性能。 为了调用方法的E …版本,调用者必须分配一个新数组。 调用者只需要推动堆栈上的args来调用其他方法。

他们这样做是为了以更有效的方式管理内存。 如果您有一组包含少量项目的不可变集合,则最好明确修复集合的大小。 否则,Java将创建一个更大的集合。 例如:除非另有说明,否则HashSet的初始大小为12个条目。