我们目前使用 apache 集合、字符串工具等。我需要决定是否应该从 apache 基础实现切换。
重要的标准是易于开发人员使用。性能/内存使用对我们来说还不是一个重要的问题。开发速度是此时的关键标准。
我很感激关于开发人员的生活如何通过 Guava 变得更加轻松的意见。
最佳答案
首先,正如 javamonkey79 所解释的那样,虽然 Google Guava 和 Apache Commons 确实具有相似的功能,但它们也都具有同类产品所没有的功能。因此,将自己限制在一个库中可能是不明智的。
话虽如此,如果我不得不选择,我会选择使用 Guava,将 Apache Commons 保留在 Guava 没有所需功能的(罕见)情况下。让我尝试解释原因。
Guava 更“现代”
Apache Commons 是一个非常成熟的库,但它也有将近 10 年的历史,并且面向 Java 1.4。 Guava 是 open sourced in 2007 ,针对 Java 5,因此 Guava 极大地受益于 Java 5 特性:泛型、可变参数、枚举和自动装箱 .
根据 Guava 开发人员的说法,泛型是他们选择创建新库而不是改进 Apache Commons 的原因之一(参见 google-collections FAQ,标题为“Google 为什么要构建这一切,当它本可以尝试改进 Apache Commons而是 Collection ?”)。
我同意他们的观点:虽然经常受到批评(没有具体化,由于向后兼容性而受到限制),Java 泛型仍然是 非常适当使用时很有用,就像 Guava 一样。我宁愿退出也不愿使用非通用集合!
(注意 Apache Commons 3.0, 做 目标 Java 1.5+)
Guava 的设计/记录非常好
代码充满了最佳实践和有用的模式,使 API 更具可读性、可发现性、性能、安全、线程安全......
阅读了 Effective Java(顺便说一句,很棒的书),我在代码中到处都看到了这些模式:
ImmutableList.copyOf()
)ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...) CharMatcher
,Joiner
,Splitter
,...)Predicates.xXx
, ...) ForwardXXX
集合)我可以花上几个小时来解释这些设计选择带来的优势(如果你愿意,请告诉我)。问题是,这些模式不仅是“为了展示”,它们还具有真正的值(value):API 使用起来很愉快,更容易学习(我忘了说它的文档有多完善吗?),更高效,并且由于它们的不变性,许多类更简单/线程安全。
作为奖励点,通过查看代码可以学到很多东西:)
Guava 是一致的
Kevin Bourrillion(Guava 的首席开发人员)在保持整个库的高质量/一致性方面做得非常出色。他当然不是一个人,还有很多great developers为 Guava 做出了贡献(甚至 Joshua Bloch,现在在 Google 工作!)。
Guava 背后的核心理念和设计选择在整个库中是一致的,开发人员遵循非常好的 (IMO) API 设计原则,从过去的 JDK API 错误中吸取教训(尽管不是他们的错误)。
Guava 具有高功率重量比
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看到一个“简单”的 builder 内蕴藏的力量。其他好的(虽然更简单?)示例是 CharMatcher , Splitter , 和 Ordering .
组合 Guava 的各个部分也很容易。例如,假设您要缓存复杂的结果 function ?将此函数提供给您的 MapMaker 和 BINGO,您将获得一个线程安全的计算 map /缓存。需要将映射/函数输入限制为特定字符串吗?没问题,把它包在ConstrainedMap里,使用 CharMatcher拒绝不合适的字符串...
Guava 正在积极开发中
虽然 Apache Commons 的开发似乎随着 Commons Lang 3.0 的工作而加速,但 Guava 似乎目前正在加速发展,而 Google 开源了更多的内部类。
由于谷歌在内部严重依赖它,我认为它不会很快消失。另外,开源其公共(public)库允许谷歌更容易地开源依赖它的其他库(而不是 repackaging 它们,比如 Guice 目前的 does )。
结论
由于上述所有原因,Guava 是我开始新项目时的首选库。我非常感谢 Google 和出色的 Guava 开发人员,他们创建了这个出色的库。
PS:您可能还想阅读 this other SO question
PPS:我没有任何谷歌股票(还)
关于java - guava 和 apache 等效库之间有哪些重大改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542550/