While going through the EnumSet<E>
of
method, I have seen multiple overloaded implementations of of
method:
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)
and then another overloaded method with 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;
}
When this varargs could have handled the other implementations, why this method is overloaded this way? Is there any specific reason for this?
I had gone through the Javadoc of the same, but I could not find any convincing explanation.
Varargs methods create an array.
This works, because of the implicit array creation.
EnumSet
is a class designed to be very, very fast, so by creating all the extra overloads they can skip the array creation step in the first few cases. This is especially true since in many casesEnum
don't have that many elements, and if they do, theEnumSet
might not contain all of them.Javadoc for
EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
: