文章目录
  1. 关于java可变参数重载
  2. 1. 场景分析
  3. 2. Google一下

关于java可变参数重载

1. 场景分析

在使用GuavaImmutableList的类的时候, 发现里面有很多of的重载方法(类似的还有java的EnumSet的of方法)。

如下:

1
2
3
4
5
6
of(E e);
of(E e1, E e2);
of(E e1, E e2, E e3);
of(E e1, E e2, E e3, E e4);
.....
of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11, E e12, E... others);

疑问:

1
为什么不直接使用可变参数, 而是在参数很少的时候使用了很多重载。

2. Google一下

EnumSet的解释

1
2
3
4
Creates an enum set initially containing the specified elements.
This factory, whose parameter list uses the varargs feature,
may be used to create an enum set initially containing an arbitrary number of elements,
but it is likely to run slower than the overloadings that do not use varargs.

按照上面的解释,有人说是varargs的方法会定义个数组传入,所以在性能上会比不使用varargs的方法慢。

ImmutableList中注释

1
2
3
4
These go up to eleven. After that, you just get the varargs form, and
whatever warnings might come along with it. :(

# up to eleven参考: https://en.wikipedia.org/wiki/Up_to_eleven

也有人说是避免java的warning(由于泛型和varargs配合不是很好),然后java的做法是使用@SafeVarargs来避免。说是提升性能的,但是ImmutableList内部依旧使用了的是construct(Object... elements)方法,也比较奇怪吧。

总之姑且认为是避免构建一个数组而提升性能,java自己也说的是likely,23333。

还有一些乱七八糟的解释和猜测只能围观stackoverflow里面其他人的解释了。

文章目录
  1. 关于java可变参数重载
  2. 1. 场景分析
  3. 2. Google一下