java - guava 和 apache 等效库之间有哪些重大改进?

标签 java apache-commons guava

我们目前使用 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 , ...)
  • 不变性(不可变集合,CharMatcherJoinerSplitter,...)
  • 实现隐藏 ( 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/

    相关文章:

    java - Spring项目部署抛出org.apache.commons.logging.Log的ClassNotFoundException

    Java:切片 Guava 多图

    java - 游戏引擎重制 - 选择语言/API(Java 或 Python)时遇到问题

    java - 带有请求正文的 GET 调用 - Controller 无法访问请求正文

    Java String to Date 格式为 “MM/dd/yyyy HH:mm:ss a” 的对象

    java - 如何使用 apache lib 获取导数

    java - 用 Java 解析 CSV 文件的一部分

    java - Apache Commons Configuration2 如何从 InputStream 读取数据

    java - Java 中与 (&&) 关系的映射

    java - 通过谓词划分集合的库方法