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

时间:2014-02-04 14:22:06

标签: java performance theory

我浏览了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);

我检查了这里的实现: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)

包装

private static <E> ImmutableSet<E> create(Iterable<? extends E> iterable, int count);

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

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

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

感谢。

3 个答案:

答案 0 :(得分: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;
    }

}

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

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

幸运的是,由于http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html

,以后将不再需要这样的事情

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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