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

mae*_*tro 8 java theory performance

我浏览了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);
Run Code Online (Sandbox Code Playgroud)

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

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

private static <E> ImmutableSet<E> create(E... elements)
Run Code Online (Sandbox Code Playgroud)

包裹了

private static <E> ImmutableSet<E> create(Iterable<? extends E> iterable, int count);
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

Mar*_*o13 4

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

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

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

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