【问题标题】:Why does Guava not use specialized classes for small ImmutableLists?为什么 Guava 不对小的 ImmutableList 使用专门的类?
【发布时间】:2012-05-13 00:22:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这个优势会随着元素的大小而减少,我认为保持 13 个类而不是 2 个类同步已经够烦人的了。数组的开销是 2 个字 + 1 个整数。这意味着总开销是 3 个字 + 1 个 int(访问时可能还有一个额外的间接)。对于具有

标签: java guava


【解决方案1】:

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

这是一个权衡:

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

我的建议:

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

郑重声明,我认为 Guava 开发人员做对了。

【讨论】:

  • 补充:在某些情况下,由于没有通过数组的额外间接,还有一点性能奖励。好总结。另外,关于您的最后一点,Raymond Chen 不久前发表了一篇关于非常相似的非常有趣的帖子:See here
  • Guava 团队成员:OP 提案节省的内存将节省 tiny 恒定数量的字节,以换取更复杂的代码、实现等。这么多额外的复杂性和可维护性/可读性成本?为了那种好处?这不是我们愿意接受的。
  • 另外,例如get(int) 必须使用开关来实现,并且迭代器会增加复杂性。万维网。最好使用 Java 开发人员为这些工作设计的工具。
  • “不要打扰 Guava 开发人员。他们已经决定了权衡取舍。你只会浪费你的呼吸。”这种态度是否源于过去与番石榴发生的一些事件?
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多