我浏览了一些Google制作的JAVA代码,发现了ImmutableSet: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html
他们用其他几种方式实现了 of() 方法:
public static <E> ImmutableSet<E> of(E e1, E e2);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5);
public static <E> ImmutableSet<E> of(E... elements);
有一个具有以下签名的创建方法:
private static <E> ImmutableSet<E> create(E... elements)
包裹着
private static <E> ImmutableSet<E> create(Iterable<? extends E> iterable, int count);
方法。公共(public)方法只是将参数传递给最终调用其他创建方法的 create(E... elements) 签名方法。
我想 public of 具有固定数量参数的方法是不必要的,因为我们有 of(E... elements) 方法。
我的问题是,他们为什么要这样做?表现?或者它是一种模式?
谢谢。
最佳答案
实际上,这与性能无关:所有方法都委托(delegate)给同一个创建方法,该方法无论如何都需要一个数组。
我的猜测是它与警告有关。考虑以下最小片段:
import java.util.List;
class ImmutableSet<T>
{
}
public class ParametersTest
{
public static void main(String[] args)
{
List<String> list0 = null;
List<String> list1 = null;
of(list0, list1);
}
@SuppressWarnings("unchecked")
public static <E> ImmutableSet<E> of(E e1, E e2) {
return create(e1, e2);
}
public static <E> ImmutableSet<E> of(E... elements) {
return create(elements);
}
private static <E> ImmutableSet<E> create(E... elements)
{
return null;
}
}
在 main 方法中调用 of
没问题:它匹配 of
方法的 2-args-version。现在注释掉 of
方法的 2-args-version。然后调用仍然可以,但是会直接调用 varags 版本。这将导致创建通用数组,并引起警告。 (显然,此警告在 2-args 版本中被抑制)。
总而言之,我假设这是为了避免向库的客户端发出警告,这些客户端想要调用具有多个通用类型对象的 of
方法。
幸运的是,由于http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html,以后不再需要这样的东西了。
关于java - 为什么需要等效方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555040/