当前位置: 首页 > 面试题库 >

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

穆高澹
2023-03-14
问题内容

在遍历该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,但是找不到任何令人信服的解释。


问题答案:

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的重载慢。



 类似资料:
  • 问题内容: 我只是看着番石榴,发现该方法被重载了12次。 在我看来,他们所需要的只是: 有这么多类似变体的原因是什么? 问题答案: Varargs和泛型不能很好地配合使用。Varargs方法可能会引发带有通用参数的警告,并且重载会阻止该警告,除非在极少数情况下,您想使用来向不可变列表中添加11个以上的项。 资料中的评论说: 这些多达十一。在那之后,您仅获得varargs表单,并且可能伴随任何警告。

  • 正如您在文档中看到的,在中有11个名为的方法: 现在来到第12个方法: 第二个代码段中的方法与第一个代码段中的方法基本相同。我的问题是,为什么Java开发人员在接口中包含了11个任意方法(第一个片段)?当我们有方法时,我们真的需要这些方法吗? 如果我只向的

  • 问题内容: 一些例子: …还有更多。它是否支持某些旧代码,还是有更好的理由?而且,我是仅根据代码的“外观”进行选择,还是两种方法中的一种优于另一种? 我可以想象有人可能想要使用(例如),但是我认为这对于像那样有用。 问题答案: 正如其他人所指出的,同名的NumPy函数和数组方法通常是等效的(它们最终会调用相同的基础代码)。如果这样可以使阅读更容易,则它可能比另一个更可取。 但是,在某些情况下,两者

  • 我是spring批处理的新手,所以也许我错了,但我不明白为什么itemWriter中的write方法需要数据列表: 如果我理解这个过程,首先是itemReader,它读取项目列表。在第一次迭代中,读取第一项,依此类推...下一步是itemProcessor,它从ItemReader获取数据。然后有一些处理和itemProcessor返回新的类,我们希望保存在某个地方。最后一步是itemWriter

  • 问题内容: 以下是EnumMap的Java文档的 “ 实现注释” 部分的内容: 实施注意事项:所有基本操作均按固定时间执行。它们可能(尽管不能保证)比其HashMap同行更快。 我在java doc中也看到了类似的内容。我想知道为什么它比散列的同行更有可能而且会更快? 问题答案: 由位数组支持。由于您可以预先输入不同项目的数量,因此我们可以简单地为每个枚举值保留一位。您可以想象对或进行类似的优化,

  • 重载方法和重写方法有什么区别?谁能举例说明一下吗?