java – 在番石榴和apache等效库之间有什么大的改进?

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

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

我会欣赏关于开发人员的生活变得明显更容易与番石榴的意见。

首先,如javamonkey79所解释的,虽然Google Guava和Apache Commons共享类似的功能,但它们都具有对应的功能。因此,限制自己只有一个图书馆可能是不明智的。

这就是说,如果我不得不选择,我会选择使用Guava,保持Apache Commons在(罕见的)Guava没有所需的功能的情况下。让我尝试解释为什么。

番石榴更“现代”

Apache Commons是一个真正成熟的库,但它也差不多10年了,并且针对Java 1.4。 Guava是open sourced in 2007,针对Java 5,因此Guava极大地受益于Java 5的特性:泛型,varargs,枚举和自动装箱。

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

我同意他们:虽然经常被批评(没有reification,由于向后兼容性有限),Java泛型仍然非常有用,当适当使用,像Guava那样。我宁愿退出比使用非泛型集合!

(注意Apache Commons 3.0,目标Java 1.5)

Guava设计得很好/文档化

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

阅读有效的Java(真棒书BTW),我看到这些模式无处不在的代码:

>工厂方法(如ImmutableList.copyOf())
>构建器模式(ImmutableList.builder(),Joiner,CharMatcher,Splitter,Ordering,…)
> immutability(immutable collections,CharMatcher,Joiner,Splitter,…)
>实现隐藏(Predicates.xXx,…)
>偏好组合而不是继承(ForwardXXX集合)
> null检查
>枚举单形模式
>序列化代理
>经过深思熟虑的命名约定

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

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

番石榴是一致的

Kevin Bourrillion(Guava的主要开发人员)在图书馆保持高水平的质量/一致性方面做得很好。他当然不是孤独的,很多great developers贡献了番石榴(甚至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看到的功率包装在一个“简单”的建设者。其他好(虽然更简单?)的例子是CharMatcher,SplitterOrdering

它也很容易组成番石榴的各个部分。例如,假设您要缓存复杂的function的结果?将此函数提供给MapMaker和BINGO,您得到了一个线程安全的计算映射/缓存。需要限制地图/函数输入到特定字符串?没问题,把它包装在一个ConstrainedMap,使用CharMatcher拒绝不适当的字符…

番石榴正在积极发展

虽然Apache Commons的发展似乎已经加速与Commons Lang 3.0的工作,Guava似乎pick up more steam at the moment,而Google开放源代码更多的内部类。

由于Google在内部非常依赖它,我不认为它会很快消失。此外,开源的通用库允许谷歌更容易地开源其他依赖于它的库(而不是repackaging他们,如Guice目前does)。

结论

由于所有上述原因,Guava是我开始一个新项目的图书馆。我非常感谢谷歌和真棒的Guava开发者,谁创造了这个梦幻般的图书馆。

PS:你可能还想读this other SO question

PPS:我没有任何Google库存(尚未)

翻译自:https://stackoverflow.com/questions/4542550/what-are-the-big-improvements-between-guava-and-apache-equivalent-libraries

转载注明原文:java – 在番石榴和apache等效库之间有什么大的改进?