为什么Guava没有为小的ImmutableList使用专门的类?

时间:2012-05-13 00:22:26

标签: java guava

Guava的ImmutableList有一系列重载的of()方法。正如在this solved question的上下文中所讨论的那样,存在这些是为了避免在将varargs与泛型混合时发生的警告。

但除此之外,0和1参数方法都依赖于专门的列表实现。对于2..11参数方法似乎可以做同样的事情,从而减少这些列表的内存消耗 - 沿着

行。
final class ImmutableListWith2Elements<E> extends ImmutableList<E> {
  final E e1;
  final E e2;
  ...

相反,它们使用基于数组的实现,这意味着除了内容引用之外,还存储数组对象和对数组的引用。你能帮我理解这里涉及的权衡吗?

1 个答案:

答案 0 :(得分:5)

  

你能帮我理解这里涉及的权衡吗?

这是一个权衡:

  • 性能 - 不分配临时数组可以节省成本。但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。阅读由@Voo提供的this link!)
  • 可读性 - 有一堆额外的重载使javadocs混乱。
  • 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。
  • 实用程序 - 这些重载的使用频率是多少?我希望答案是&#34;很少&#34;。
  • 字节码占用空间 - 这些额外的重载会导致使用Guava JAR文件的每个应用程序的应用程序膨胀。

我的建议:

  • 不要让番石榴开发者对此感到沮丧。他们已经决定了权衡取舍。你只是在浪费你的气息。
  • 如果缺少这些类或方法会损害您的应用程序,请自行添加。 (但尝试以一种不涉及番石榴私人&#34;叉子的方式来做这件事......因为从长远来看,你可能会后悔。)

为了记录,我认为Guava开发人员做对了。