为什么Guava类提供了如此多的工厂方法而不是只提供varargs的方法?
可能重复:
为什么Guava的ImmutableList有这么多重载的()方法?
看看Guava的ImmutableList (以及其他一些类),你会发现大量的方便方法(“返回包含给定元素的不可变列表,按顺序。”),它们采用不同数量的参数:
... public static ImmutableList of(E e1, E e2, E e3) public static ImmutableList of(E e1, E e2, E e3, E e4) public static ImmutableList of(E e1, E e2, E e3, E e4, E e5) ...
一直到这个:
public static ImmutableList 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)
我的一些同事认为这很愚蠢,想知道为什么不只有一种方法: of(E... elements)
。 他们怀疑这是一个不良导向的性能“优化”,属于“你认为你比编译器更聪明”的类别,或类似的东西。
我的预感是Kevin Bourrillion等人。 把这些方法放在那里是出于真正的原因。 谁能解释(或推测)这个理由可能是什么?
消息来源中的评论说:
// These go up to eleven. After that, you just get the varargs form, and // whatever warnings might come along with it. :(
所以,这是因为varargs方法产生带有generics参数的警告。
我认为当E
是generics类型时,应避免unchecked generic array creation
警告。
这是为了避免为最常见的用例创建varargs数组的开销。 这是在EnumSet.of(..)的设计方式之后建模的。
实际上编译器非常愚蠢,JVM具有大部分智能,但它仍然不够智能,无法为vararg创建arrays。
是否真的值得保存arrays,也许是作者不希望用户担心的事情。 也就是说,他可能知道它并没有太大的区别,但并非所有用户都会意识到99%的时间都不值得担心。
当它是google-collections时,这是描述“标准集合类型的高性能不可变实现,例如ImmutableSet”的一部分
我能想到的是避免编译器混淆。
如果我们只有,
public static ImmutableList of(E element); //Option 1
和
public static ImmutableList of(E... elements); //Option 2
在你的代码中我们有
ImmutableList list = ImmutableList.of("Value");
编译器不知道是调用选项1还是选项2。
Josh Bloch,Kevin Bourrillion和他的团队必须有一个合理的理由,认为他们of(...)
方法有“荒谬” of(...)
看法。
- Java 8是否缓存了对供应商的支持?
- Functional Java和Guava之间有很好的比较吗?
- JUnit抛出java.lang.NoSuchMethodError对于com.google.common.collect.Iterables.tryFind
- Java 8可选asSet()
- 关键的番石榴内存泄漏 – 需要解决方法
- 如何从java字符串中删除控制字符?
- Spark – 可以在JAVA中将MultiMap转换为DataFrame
- google common cache – maximumSize的默认值(和其他“可选”设置) – 想要一个使用所有“可用”内存的缓存
- Java Guava组合Multimap和Cache