java - 为什么需要等效方法重载?

标签 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) 签名方法。

我想 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/

相关文章:

java - 如何为 main 方法编写 Junit,将 "Hello, World!"字符串打印到控制台并使用 Spring 框架

python - 使用 10**9 的成本超过 1000000000?

.net - 为什么使用 GetHashCode() 而不是 Equals()?

c# - 异步等待性能?

java - JFrame和JOptionPane不清楚

java - 初始化一副牌时如何使用toString方法

java - 查找两个矩阵之间的偏移量

python - 具有约 2000 万个样本点和千兆字节数据的交互式大图

mobile - 计算机科学的哪些领域与移动开发特别相关?

distributed-computing - 什么时候使用Paxos这样的共识算法而不是Vector Clock?