为什么Guava的ImmutableList有这么多重载的()方法?

2022-09-01 02:35:46

我只是在看Guava的ImmutableList,我注意到该方法被重载了12次。of()

在我看来,他们所需要的只是:

static <E> ImmutableList<E> of();
static <E> ImmutableList<E> of(E element); // not even necessary
static <E> ImmutableList<E> of(E... elements);

有这么多类似变体的原因是什么?


答案 1

Varargs和泛型不能很好地协同工作。Varargs 方法可以使用泛型参数导致警告,重载会阻止该警告,除非在极少数情况下,您希望使用 向不可变列表中添加 11 个以上的项目。of()

消息来源的评论说:

这些增加到十一个。之后,你只需要得到varargs形式,以及任何可能随之而来的警告。:(

请注意,Java 7@SafeVarargs注释是专门为消除对此类事物的需求而添加的。可以使用 带注释的单个方法,并且不会使用通用参数发出警告。of(E...)@SafeVarargs


答案 2

还有一个性能原因。varargs 方法的每次调用都会导致数组分配和初始化。如果您以某种方式确定例如95%的调用具有3个或更少的参数,只有5%具有4个或更多参数,那么像这样重载

public static <E> ImmutableList<E> of();
public static <E> ImmutableList<E> of( E e );
public static <E> ImmutableList<E> of( E e1, E e2 );
public static <E> ImmutableList<E> of( E e1, E e2, E e3 );
public static <E> ImmutableList<E> of( E e1, E e2, E e3, E... es );

在95%的情况下,性能提升不错。换句话说,平均案例性能会上升。