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

我们目前使用 apache 集合、 string utils 等。我需要决定我们是否应该从 Apache 基础实现切换。

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

如果有人能告诉我如何使用番石榴使开发人员的生活变得更加轻松,我将不胜感激。

27858 次浏览

根据我的经验,我不觉得它们会相互竞争,也不觉得番石榴可以改善阿帕奇人的生活。相反,番石榴 互补的阿帕奇利布斯。番石榴中有一些类和实用程序不在 apache 中,反之亦然。

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

首先,正如 Javamonkey79解释的那样,尽管 Google Guava 和 Apache Commons 具有相似的特性,但它们都具有对应方所没有的功能。因此,将自己限制在一个库中可能是不明智的。

也就是说,如果必须选择的话,我会选择使用 Guava,保留 Apache Commons 以应对(罕见的) Guava 不具备所需功能的情况。让我试着解释一下为什么。

番石榴更“现代”

ApacheCommons 是一个非常成熟的库,但是它也有将近10年的历史了,目标是 Java 1.4。番石榴是 open sourced in 2007,目标是 Java5,因此是 番石榴从 Java5特性中受益匪浅: < em > 泛型 、 < em > varargs 、 < em > enums 和 < em > 自动装箱

According to the Guava developers, generics are one reason they chose to create a new library instead of improving Apache Commons (see the 谷歌收藏常见问题解答, under the title "Why did Google build all this, when it could have tried to improve the Apache Commons Collections instead?").

I agree with them: while often criticized (no reification, limited due to backward compatibility), Java generics are still 非常 useful when used appropriately, like Guava does. I'd rather quit than work with non-generified collections!

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

番石榴设计得很好/记录得很好

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

读过 有效的爪哇(顺便说一句,这本书很棒)之后,我发现这些模式在代码中随处可见:

  • 工厂方法(例如 ImmutableList.copyOf())
  • 构建器模式(ImmutableList.builder()JoinerCharMatcherSplitterOrdering,...)
  • 不可变性(不可变集合,CharMatcherJoinerSplitter,...)
  • 实现隐藏(Predicates.xXx,...)
  • 有利于组合而不是继承(ForwardXXX集合)
  • 无效检查
  • Enum-singleton 模式
  • 序列化代理
  • 经过深思熟虑的命名惯例

我可以花几个小时解释这些设计选择带来的好处(如果你想让我这么做,请告诉我)。问题是,这些模式不仅仅是“为了展示”,它们还有真正的价值: API 使用起来很愉快,学起来更容易(我是否忘了说它有多么好的文档化?),更有效,而且由于它们的不可变性,许多类更简单/线程安全。

另外,通过查看代码可以学到很多东西:)

番石榴是一成不变的

Kevin Bourrillion (Guava 的首席开发人员)在维护整个库的高质量/一致性方面做得很好。他当然不是一个人,很多 伟大的开发商都为 Guava 做出了贡献(甚至是现在在 Google 工作的 约书亚 · 布洛赫!).

Guava 背后的核心理念和设计选择在整个库中都是一致的,开发人员坚持非常好的(IMO) API 设计原则,从过去的 JDK API 错误中吸取了教训(尽管不是 他们的错误)。

番石榴的功率重量比很高

番石榴设计师抵制住了添加太多功能的诱惑,将 API 限制在最有用的功能上。他们知道,一旦添加了某个特性,就很难删除,而且很难遵循 Joshua Bloch 关于 API 设计的座右铭: “如果有疑问,不要提”。此外,使用@Beta 注释允许他们使用 test some design choices without committing to a specific API

上面提到的设计选择允许一个非常紧凑的 API。简单地看看 地图制作者,看看一个“简单”的建设者内部的电源。其他好处(尽管更简单?)例如 CharMatcher分裂者点菜

这也是非常容易组成各种部分的番石榴。例如,假设您想缓存复杂 功能的结果?把这个函数反馈给 MapMaker 和 BINGO,你就得到了一个线程安全的计算映射/缓存。需要将映射/函数输入限制为特定的 String 吗?没问题,把它包装在一个 ConstrainedMap中,使用一个 CharMatcher来拒绝不合适的字符串..。

番石榴正在积极开发中

虽然 Apache Commons 的开发似乎随着 Commons Lang 3.0的开发而加速,但 Guava 目前似乎获得了更多的动力,而 Google 则开放了更多的内部类。

由于谷歌内部严重依赖它,我不认为它会很快消失。另外,开源的公共库使 Google 能够更容易地开源依赖于它的 其他库(而不是像 Guice 现在的 是的那样依赖于 重新包装库)。

结论

For all the above reasons, Guava is my go-to library when starting a new project. And I am very grateful to Google and to the awesome Guava developers, who created this fantastic library.


附注: 您可能还想阅读 另一个问题

附言: 我目前还没有任何谷歌股票

我从2010年8月开始使用番石榴,从 r06版本开始。基本上,我需要开发一个 greenfield Java 库,所以我四处寻找用于 J2SEAPI 的最佳附属库。传统上,我们使用 ApacheCommons 库,但我想看看那里有什么,并开始使用 Guava。

优点

  1. Java 5.0语言构造。该库的大部分设计线索来自 Bloch 的“高效 Java: 第2版”: 不变性、构建器模式、工厂而不是构造器、泛型等。这使您的代码更紧凑、更有表现力。
  2. 函数式编程支持,特别是对顶级函数和谓词接口的支持。

缺点

  1. 它不足以替代 Apache Commons,特别是 Commons-codec。
  2. 没有“番石榴食谱”。该库既是极简主义的,又是正交的。因此,有一个明确的学习曲线来充分利用它。正如前面提到的,Javadoc 非常优秀,但是一些更长的源代码案例研究会很有帮助。
  3. If you're in an environment requiring Java 1.3 or 1.4, you're out of luck.

对我来说,番石榴使 Java 更接近于一种简洁、富有表现力的脚本语言,这很棒。