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


123

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

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

我希望能得到有关番石榴使开发人员的生活变得更加轻松的意见。

Answers:


223

首先,正如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常见问题,标题为“为什么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即可查看“简单”构建器中包含的功能。其他好的(尽管更简单?)示例是CharMatcherSplitterOrdering

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

番石榴正在积极发展中

虽然随着Commons Lang 3.0的开发,Apache Commons的开发似乎有所加速,但Guava似乎在此刻获得了更多的动力,而Google则开放了更多内部类的资源。

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

结论

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


PS:您可能还想阅读其他SO问题

PPS:我还没有任何Google股票(至今)


谢谢!*脸红*我刚刚编辑了答案,以谈论有关Guava非常活跃的开发的更多信息,并更好地详细说明Java 1.5功能。
Etienne Neveu 2010年

1
刚刚注意到,凯文·布洛里恩(Kevin Bourrillion)在这次演讲中谈到了番石榴与Apache Commons:youtube.com/watch?
艾蒂安

值得一提的是,Guava经常更改其API并弃用其旧方法,因此对其进行依赖可能会导致版本锁定以及与使用Guava的其他第三方库不兼容的问题。
阿基米德·特拉哈诺

24

从r06版本开始,我从2010年8月开始就使用番石榴。基本上,我有一个未开发的Java库要开发,因此我寻找了J2SE API的最佳辅助库。传统上,我们使用Apache Commons库,但是我想看看那里有什么,并开始使用Guava。

优点

  1. Java 5.0语言构造。该库从Bloch的“ Effective Java:2nd Edition”中获取了大部分设计线索:不可变性,构建器模式,工厂而不是构造函数,泛型等。这使您的代码更紧密,更具表现力。
  2. 功能编程支持,尤其是顶级功能和谓词接口。

缺点

  1. 这还不足以替代Apache Commons,尤其是commons编解码器。
  2. 没有“番石榴食谱”。该库既简约又正交。因此,有一个明确的学习曲线可以充分利用它。如前所述,Javadoc非常出色,但是一些较长的源代码案例研究会有所帮助。
  3. 如果您在需要Java 1.3或1.4的环境中,那么您将不走运。

对我来说,Guava使Java感觉更接近简洁的表达性脚本语言,这很棒。


16

以我的经验,我认为它们之间并不存在竞争,或者说番石榴在apache库中有所改善。番石榴补充了Apache libs。番石榴中有一些类和实用程序不在Apache中,反之亦然。

因此,我不知道您是否需要切换-我会说“使用正确的工具完成正确的工作”。


1
在看到Guava与Apache在FileNameUtils中提供的功能几乎没有什么之后,我最近得出了这个结论(是的,但是有重叠,但是Apache的FileNameUtils具有比Guava的文件更多的功能。而且,为什么Google必须使用Files?现在我想随时使用要使用JDK Files,我必须写出整个路径...)。我的应用程序需要很多File实用程序,因此在这种情况下我无法避免使用Apache。
唐·奇德尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.