4

GuavaImmutableList有一系列的重载of()方法。正如在这个已解决问题的上下文中所讨论的那样,这些存在是为了避免在将可变参数与泛型混合时出现的警告。

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

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

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

4

1 回答 1

5

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

这是一个权衡:

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

我的建议:

  • 不要因此而困扰 Guava 开发人员。他们已经决定了权衡取舍。你只会浪费你的呼吸。
  • 如果缺少这些类或方法会损害您的应用程序,请自行添加。(但尝试以不涉及番石榴的私人“分叉”的方式进行......因为从长远来看你可能会后悔。)

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

于 2012-05-13T00:48:06.087 回答