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

但是除此之外,0和1参数方法分别依赖于专门的列表实现。似乎可以对2..11参数方法执行相同的操作,从而减少这些列表的内存消耗-沿着

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

相反,他们使用基于数组的实现,这意味着除了内容引用之外,还存储一个数组对象和对该数组的引用。您能帮助我了解此处涉及的取舍吗?

最佳答案

您能帮助我了解此处涉及的取舍吗?

这是以下两者之间的权衡:

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

  • 我的建议:
  • 不要让Guava开发人员对此感到困惑。他们已经下定了决心。你只是在浪费你的呼吸。
  • 如果缺少这些类或方法会损害您的应用程序,请滚动自己的添加项。 (但是尝试以不涉及番石榴的私人“叉子”的方式来做……因为从长远来看,您可能会后悔。)


  • 作为记录,我认为Guava开发人员是正确的。

    10-06 06:38
    查看更多