小编典典

为什么EnumSet有许多重载的“ of”方法?

java

在遍历该EnumSet<E> of方法时,我看到了方法的多个重载实现of

public static <E extends Enum<E>> EnumSet<E> of(E e)

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)

.
.

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)

然后另一个重载方法 varargs

public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
    EnumSet<E> result = noneOf(first.getDeclaringClass());
    result.add(first);
    for (E e : rest)
        result.add(e);
    return result;
}

当此varargs可以处理其他实现时,为什么以这种方式重载此方法?有什么具体原因吗?

我已经阅读过相同的Javadoc,但是找不到任何令人信服的解释。


阅读 221

收藏
2020-11-16

共1个答案

小编典典

Varargs方法创建一个数组。

public static void foo(Object... args) {
  System.out.println(args.length);
}

这是有效的,因为创建了隐式数组。EnumSet是一个设计得非常快的类,因此通过创建所有额外的重载,它们可以在前几种情况下 跳过数组创建步骤
。这是特别正确的,因为在许多情况下Enum没有那么多元素,如果有的话,EnumSet可能不会包含所有元素。

Javadoc适用于EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)

创建一个最初包含指定元素的枚举集。存在此方法的重载以初始化具有一到五个元素的枚举集。提供了使用varargs功能的第六重载。此重载可用于创建最初包含任意数量的元素的枚举集,但运行速度可能比不使用varargs的重载慢。

2020-11-16