guava和apache等价库之间有哪些重大改进?

时间:2010-12-27 23:18:46

标签: java apache-commons guava

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

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

我很欣赏有关番石榴开发人员生活变得如此轻松的意见。

3 个答案:

答案 0 :(得分:221)

首先,正如 javamonkey79 所解释的那样,虽然Google Guava和Apache Commons确实共享相似的功能,但它们都具有相应功能。因此,将自己限制在只有一个库可能是不明智的。

话虽这么说,如果我不得不选择,我会选择使用Guava,让Apache Commons保持在(Guod)没有所需功能的(罕见)情况下。让我试着解释一下原因。

番石榴更“现代”

Apache Commons是一个非常成熟的库,但它也差不多10年了,它的目标是Java 1.4。 Guava是open sourced in 2007,目标是Java 5,因此 Guava极大地受益于Java 5的功能:泛型 varargs enums ,和 autoboxing

根据Guava开发人员的说法,泛型是他们选择创建新库而不是改进Apache Commons的一个原因(参见google-collections FAQ,标题为“为什么Google构建所有这些,当它本来可以尝试改进Apache Commons Collections吗?“)。

我同意他们的观点:虽然经常受到批评(没有具体化,但由于向后兼容性而受到限制),但如果使用得当,Java泛型仍然非常有用非常非常有用。我宁愿退出而不是使用非一般化的集合!

(请注意,Apache Commons 3.0,确实定位Java 1.5 +)

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

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

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

  • 工厂方法(例如ImmutableList.copyOf()
  • 构建器模式(ImmutableList.builder()JoinerCharMatcherSplitterOrdering,...)
  • 不变性(不可变集合,CharMatcherJoinerSplitter,...)
  • 实施隐藏(Predicates.xXx,...)
  • 赞成合成而不是继承(ForwardXXX集合)
  • 空检查
  • enum-singleton pattern
  • 序列化代理
  • 深思熟虑的命名惯例

我可以继续几个小时来解释这些设计选择带来的好处(告诉我你是否想要我)。问题是,这些模式不仅仅是“为节目”,它们还有一个真正的价值:API是一种使用的乐趣,更容易学习(我忘了说它有多少记录?),更有效,以及由于它们的不变性,许多类都更简单/线程安全。

作为奖励点,通过查看代码可以学到很多东西:)

番石榴是一致的

Kevin Bourrillion(Guava的首席开发人员)在整个图书馆保持高水平的质量/一致性方面做得很好。他当然并不孤单,很多great developers都为Guava做出了贡献(甚至Joshua Bloch,现在在谷歌工作!)。

Guava背后的核心理念和设计选择在整个库中是一致的,开发人员遵循非常好的(IMO)API设计原则,从过去的JDK API错误中学习(不是他们的但是错误。

番石榴具有高功率重量比

Guava设计师抵制添加太多功能的诱惑,将API限制为最有用的功能。他们知道添加后删除功能非常困难,请按Joshua Bloch's motto on API design: "When in doubt, leave it out"进行操作。此外,使用@Beta注释可以使它们test some design choices without committing to a specific API

上面提到的设计选择允许非常紧凑的API。只需查看MapMaker即可查看“简单”构建器中的功能。其他好的(虽然更简单?)示例包括CharMatcherSplitterOrdering

组成番石榴的各个部分也很容易。例如,假设您要缓存复杂function的结果?将此函数提供给MapMaker和BINGO,您就拥有了一个线程安全的计算映射/缓存。需要将地图/函数输入约束到特定的字符串?没问题,请将其包含在ConstrainedMap内,使用CharMatcher拒绝不合适的字符串......

番石榴正在积极开发

虽然Apache Commons的开发似乎已经加速了Commons Lang 3.0的工作,但是Guava似乎在此刻获得了更多的动力,而谷歌开放更多的内部类。

由于谷歌在内部严重依赖它,我认为它不会很快消失。此外,开源其公共库允许Google更轻松地开源依赖它的其他库(而非repackaging它们,如Guice当前does)。

结论

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


PS:您可能还想阅读this other SO question

PPS:我还没有任何谷歌股票

答案 1 :(得分:24)

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

赞成

  1. Java 5.0语言构造。该库从Bloch的“Effective Java:2nd Edition”中获取了大部分设计线索:Immutability,builder模式,工厂而不是构造函数,Generics等。这使您的代码更紧凑,更具表现力。
  2. 功能编程支持,特别是顶层的Function和Predicate接口。
  3. 缺点

    1. 它不足以替代Apache Commons,特别是commons-codec。
    2. 没有'番石榴食谱'。该库既简约又正交。因此,有一个明确的学习曲线来充分利用它。如上所述,Javadoc非常出色,但一些较长的源代码案例研究会有所帮助。
    3. 如果你所处的环境需要Java 1.3或1.4,那你就不走运了。
    4. 对我来说,Guava让Java感觉更接近一种简洁,富有表现力的脚本语言,这很棒。

答案 2 :(得分:16)

根据我的经验,我并不认为他们彼此抗争,或者番石榴改进了apache libs。相反,番石榴补充 apache库。番石榴中的类和实用程序不在apache中,反之亦然。

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

相关问题