为什么Guava不为小的ImmutableLists使用专门的类?

Tor*_*nik 4 java guava

Guava ImmutableList有一系列重载of()方法.正如在这个解决的问题的上下文中所讨论的那样,存在这些以避免在将varargs与泛型混合时发生的警告.

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

final class ImmutableListWith2Elements<E> extends ImmutableList<E> {
  final E e1;
  final E e2;
  ...
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 5

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

这是一个权衡:

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

我的建议:

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

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

  • 番石榴团队成员:OP提案节省的内存将节省_tiny_常量字节数,以换取更复杂的代码,实现等.那么多额外的复杂性和可维护性/可读性成本?为了那种好处?这不是我们愿意接受的东西. (4认同)
  • "不要让番石榴开发者对此事感到不满.他们已经对这些权衡做出了决定.你只会浪费你的气息." 这种态度是否源于过去与番石榴的事件? (2认同)