番石榴和Apache等效库有什么大的改进?

我们目前使用apache集合,stringutils等,我需要决定是否应该从Apache基础实施切换。

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

我会很感激关于如何开发者的生活变得更容易与番石榴的意见。

首先,正如javamonkey79所解释的那样,虽然Google Guava和Apache Commons也有类似的function,但是它们也都具有对应function。 因此,仅限于一个图书馆可能是不明智的。

这就是说,如果我不得不select,我会select使用番石榴,保持Apache Commons周围的(罕见)番石榴没有所需的function的情况下。 让我试图解释为什么。

番石榴更“现代”

Apache Commons是一个非常成熟的库,但它也已经快10年了,面向Java 1.4。 Guava 于2007年开源 ,面向Java 5,因此Guava从Java 5的特性中受益匪浅: generics可变参数枚举自动装箱

根据Guava开发者的说法,generics是他们select创build新库的一个原因,而不是改进Apache Commons(请参阅google-collections FAQ ,标题为“Google为什么要构build所有这些,试图改进Apache Commons Collections呢?“ )。

我同意他们:虽然经常批评(没有具体化,由于向后兼容性有限),Javagenerics仍然是非常有用的时候适当使用,就像番石榴一样。 我宁可退出,也不愿意与非集体化的作品合作!

(请注意,Apache Commons 3.0的目标是Java 1.5+)

番石榴是非常好devise/logging

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

读过Effective Java (awesome book BTW)之后,我在代码中看到了这些模式:

  • 工厂方法(如ImmutableList.copyOf()
  • ImmutableList.builder()JoinerCharMatcherSplitterOrdering等)
  • 不变性(不可变的集合, CharMatcherJoinerSplitter ,…)
  • 实现隐藏( Predicates.xXx ,…)
  • 有利于构图而不是inheritance( ForwardXXX集合)
  • 空检查
  • 枚举 – 单例模式
  • 序列化代理
  • 深思熟虑的命名约定

我可以继续讲解这些deviseselect带来的好处(告诉我,如果你想要我的话)。 问题是,这些模式不仅仅是“表演”,它们有一个真正的价值:API是一个使用的乐趣,更容易学习(我忘了说它有多好的文档),更有效率,许多类由于其不可变性而更简单/线程安全。

作为一个奖励点,通过查看代码,学习了很多:)

番石榴是一贯的

Kevin Bourrillion(Guava的首席开发人员)在整个图书馆保持高水平的质量/一致性方面performance出色。 当然,他并不孤单,许多伟大的开发者也贡献了番石榴(甚至现在在Google工作的Joshua Bloch !)。

Guava背后的核心理念和deviseselect在整个图书馆是一致的,开发者坚持非常好的(IMO)APIdevise原则,从以前的JDK API错误中学习(不是他们的错误)。

番石榴具有很高的功率重量比

番石榴devise师抵制添加太多function的诱惑,将API限制为最有用的function。 他们知道一旦添加function就很难删除一个function,并按照Joshua Bloch在APIdevise上的口号:“如果有疑问,请将其忽略” 。 另外,使用@Beta批注允许他们testing一些deviseselect,而不必提交给特定的API 。

上面提到的deviseselect允许一个非常紧凑的API。 只需看一下MapMaker就可以看到“简单”构build器内部的function。 其他好的(虽然比较简单)的例子是CharMatcher , Splitter和Ordering 。

组成番石榴的各个部分也很容易。 例如,假设你想caching一个复杂函数的结果? 把这个函数送到你的MapMaker和BINGO,你有一个线程安全的计算映射/caching。 需要将映射/函数input约束到特定的string? 没问题,将其包装在ConstrainedMap中 ,使用CharMatcher拒绝不适当的string…

番石榴正在积极发展

虽然Apache Commons的开发似乎在Commons Lang 3.0的工作上已经加速,但番石榴似乎正在酝酿更多的热潮 ,而Google则更多地开放内部类。

由于Google在内部严重依赖它,我认为它不会很快消失。 此外,开放源代码的公共库允许Google更容易地开放源代码依赖它的其他库(而不是像Guice目前那样 重新包装它们)。

结论

由于上述原因,番石榴是我开始一个新项目时的前往图书馆。 我非常感谢Google以及创build这个梦幻般的图书馆的出色的Guava开发人员。


PS:你也可能想读这个其他的SO问题

PPS:我没有任何Google股票(尚未)

自2010年8月起,我一直使用番石榴,从r06版本开始。 基本上,我有一个开发的绿地java库,所以我四处寻找J2SE API的最佳辅助库。 传统上,我们使用Apache Commons库,但我想看看那里有什么,并开始使用番石榴。

优点

  1. Java 5.0语言结构。 该库从Bloch的“Effective Java:2nd Edition”中获得了大部分devise线索:不变性,构build器模式,工厂而不是构造器,generics等。这使得您的代码更加紧密和更具performance力。
  2. 函数式编程支持,特别是顶层的Function和Predicate接口。

缺点

  1. 这不足以取代Apache Commons,特别是Commons-Codec。
  2. 没有“番石榴菜谱”。 图书馆既简约又正交。 因此,充分利用它,有一个确定的学习曲线。 如前所述,Javadoc非常好,但是一些更长的源代码案例研究将会有所帮助。
  3. 如果您处于需要Java 1.3或1.4的环境中,那么您运气不好。

对我来说,番石榴使得Java感觉更接近于一种简洁,富有performance力的脚本语言,这很好。

根据我的经验,我不认为他们彼此竞争,或番石榴改善了Apache的库。 相反,番石榴补充了Apache的库。 有番石榴的类和实用程序,不在Apache中,反之亦然。

因此,我不知道你需要切换本身 – 我会说“使用正确的工具来做正确的工作”。