当前位置: 首页 > 面试题库 >

番石榴和apache等效库之间有哪些重大改进?

益何平
2023-03-14
问题内容

当前,我们使用apache集合,字符串utils等。我需要确定是否应该从apache基础实现中切换。

重要标准是开发人员的易用性。性能/内存使用对于我们来说还不是一个重要的问题。开发速度是此时的关键标准。

我希望能对番石榴使开发人员的生活变得更加轻松的观点表示赞赏。


问题答案:

首先,正如 javamonkey79所 解释的,尽管Google Guava和Apache
Commons确实具有相似的功能,但是它们都具有相对应的功能。因此,将自己限制为仅一个库可能是不明智的。

话虽这么说,但如果我不得不选择的话,我会选择使用Guava,在Guava没有所需功能的罕见情况下,请使用Apache Commons。让我尝试解释原因。

番石榴更“现代”

Apache Commons是一个非常成熟的库,但它也已有近10年的历史,并且针对Java 1.4。Guava
于2007年开源,目标是Java 5,因此 Guava极大地受益于Java 5功能: 泛型
varargs枚举自动装箱

根据Guava开发人员的说法,泛型是他们选择创建新库而不是改进Apache Commons的原因之一(请参阅google-collections
FAQ,标题为
“为什么Google可能会尝试改进Apache,但为什么要构建所有这些库呢?改为使用Commons Collections?” )。

我同意他们的观点:尽管经常受到批评(没有版本化,由于向后兼容性而受到限制),但Java泛型在适当使用时仍然 非常
有用,就像Guava一样。我宁愿退出,也不愿使用非通用的收藏夹!

(请注意,Apache Commons 3.0 确实 针对Java 1.5+)

番石榴是非常好的设计/记录

该代码充满了最佳实践和有用的模式,可以使API更具可读性,可发现性,高性能,安全性,线程安全性…

阅读了 有效的Java (很棒的书BTW),我在代码中到处都可以看到这些模式:

  • 工厂方法(例如ImmutableList.copyOf()
  • 生成器模式(ImmutableList.builder()JoinerCharMatcherSplitterOrdering,…)
  • 不变性(不变的集合,CharMatcherJoinerSplitter,…)
  • 隐藏实现(Predicates.xXx,…)
  • 偏重于继承而不是继承(ForwardXXX集合)
  • 空检查
  • 枚举-单子模式
  • 序列化代理
  • 深思熟虑的命名约定

我可以花几个小时解释这些设计选择带来的好处(如果需要,请告诉我)。事实是,这些模式不仅是“用于展示”,而且它们具有真正的价值:API易于使用,易于学习(我忘了说它的文档记录得很好吗?),效率更高,由于它们的不可变性,许多类更简单/线程安全的。

作为奖励,您可以通过查看代码来学习很多:)

番石榴是一致的

Kevin
Bourrillion(Guava的首席开发人员)在保持整个库的高质量/一致性方面做得很好。当然,他并不孤单,而且许多杰出的开发人员都为Guava做出了贡献(甚至是现在在Google工作的Joshua
Bloch!)。

在整个库中,Guava背后的核心理念和设计选择是一致的,并且开发人员遵循了非常好的(IMO)API设计原则,从过去的JDK API错误中吸取了教训(尽管不是
他们的 错误)。

番石榴的功率重量比高

Guava设计人员抵制了添加太多功能的诱惑,从而将API限制为最有用的功能。他们知道很难删除添加的功能,并遵循Joshua
Bloch关于API设计的座右铭:“如有疑问,请不要使用”。同样,使用@Beta批注使他们可以测试某些设计选择,而无需提交特定的API。

上面提到的设计选择允许使用非常紧凑的API。只需查看MapMaker即可查看“简单”构建器中包含的功能。其他好的(尽管更简单?)示例是CharMatcher,Splitter和Ordering。

组成番石榴的各个部分也非常容易。例如,假设您要缓存复杂函数的结果?将此功能提供给MapMaker和BINGO,即可获得线程安全的计算地图/缓存。是否需要将map
/
function输入限制为特定的String?没问题,将其包装在ConstrainedMap中,使用CharMatcher拒绝不适当的字符串…

番石榴正在积极发展中

尽管随着Commons Lang 3.0的开发,Apache
Commons的开发似乎有所加速,但Guava似乎正在加速发展,而Google则开放了更多内部类的资源。

由于Google内部高度依赖它,因此我认为它不会很快消失。另外,通过开源其通用库,Google可以更轻松地开源 其他
依赖于它的库(而不是像Guice当前所做的那样重新打包)。

结论

由于上述所有原因,Guava是我开始新项目时的首选库。非常感谢Google和创建了这个出色库的Guava开发人员。



 类似资料:
  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 我有一个未来的列表,在每个未来完成后,我有一个应该执行的回调。 我在使用期货。successfulAsList检查是否所有期货都已完成。然而,这并没有考虑回调的完成。 有没有办法确保回调完成? 我可以用期货代替回调。转换为包装到另一个未来,并检查其是否完成。然而,这样一来,我就无法访问包装好的将来引发的运行时异常。

  • 问题内容: 在我的Java代码中,我通过以下方式使用Guava的Multimap(com.google.common.collect.Multimap): 此处,Multimap键是URL的一部分,而值是URL的另一部分(转换为整数)。现在,我分配了JVM 2560 Mb(2.5 GB)堆空间(通过使用Xmx和Xms)。但是,它只能存储900万个这样的(键,值)整数对(大约1000万个)。但是,理

  • 问题内容: 说我有一个这样定义的: 根据我的阅读 (如果我错了,请纠正我): 如果将值写入0:00,则应在60秒后将其移至“准备退出”状态。从中实际删除值将在下一次 缓存修改 时发生(究竟是什么缓存修改?)。 那正确吗? 另外,我不确定和方法之间有什么区别,有人可以提供解释吗? 问题答案: *此链接的 *第一部分 :Guava如何使CacheBuilder中的条目到期? 我将重点讨论 expire

  • 我对番石榴很陌生(说实话,我不是“很新”,我是这个主题的新手),所以我决定浏览一些文档,在阅读本文时感到非常惊讶: 我不明白这个方法的意义。这意味着,与其这样做,不如: (如果myObject为null,这可能会导致) 我应该用 如果为空,这将抛出一个,如果它不是空,则返回。 我很困惑,这可能是有史以来最愚蠢的问题,但是... 这有什么意义?这两条线和我能想到的任何情况下的结果是完全一样的。 我甚

  • 问题内容: 我的应用程序对它的依赖程度很高或更高 但是我也在使用它与> 22.0的番石榴版本不兼容,如下所述: https://github.com/SeleniumHQ/selenium/issues/4381 我对Java很陌生,这里最好的做法是什么? 我已经研究过类加载器,但是看起来像是一个很深的兔子洞。 问题答案: 由于您对 使用的依赖度很高,因此 可能会遇到麻烦。但是 Selenium发