番石榴和apache等效库之间的重大改进是什么?

2022-08-31 08:40:42

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

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

我很感激关于开发人员的生活如何通过番石榴变得更容易的意见。


答案 1

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

话虽如此,如果我必须选择,我会选择使用Guava,在Guava没有所需功能的(罕见)情况下保留Apache Commons。让我试着解释一下为什么。

番石榴更“现代”

Apache Commons是一个非常成熟的库,但它也有近10年的历史,并且针对Java 1.4。Guava于2007年开源,以Java 5为目标,因此Guava从Java 5的功能中受益匪浅:泛型varargs枚举自动装箱

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

我同意他们的观点:虽然经常受到批评(没有重新化,由于向后兼容性而受到限制),但Java泛型在适当使用时仍然非常有用,就像Guava一样。我宁愿退出,也不愿使用非通用集合!

(请注意,Apache Commons 3.0确实针对Java 1.5 +)

番石榴设计得很好/有据可查

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

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

  • 工厂方法(如ImmutableList.copyOf())
  • 生成器模式 (, , , , ,...)ImmutableList.builder()JoinerCharMatcherSplitterOrdering
  • 不可变性(不可变集合、、 、 ,...)CharMatcherJoinerSplitter
  • 实现隐藏 (, ...)Predicates.xXx
  • 偏爱组合而不是继承(集合)ForwardXXX
  • 空检查
  • 枚举单例模式
  • 序列化代理
  • 深思熟虑的命名约定

我可以继续几个小时来解释这些设计选择带来的好处(如果你希望我这样做,请告诉我)。问题是,这些模式不仅“为了节目”,它们还有一个真正的价值:API使用起来很愉快,更容易学习(我忘了说它记录得有多好吗?),效率更高,而且许多类由于它们的不变性而更简单/线程安全。

作为奖励点,通过查看代码:)

番石榴是一致的

Kevin Bourrillion(番石榴的首席开发人员)在保持整个库的高质量/一致性方面做得很好。他当然并不孤单,许多伟大的开发人员都为番石榴做出了贡献(甚至是现在在谷歌工作的Joshua Bloch!)。

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

番石榴具有高功率重量比

番石榴设计师抵制了添加太多功能的诱惑,将API限制在最有用的功能上。他们知道一旦添加一个功能就很难删除,并遵循Joshua Bloch关于API设计的座右铭:“当有疑问时,把它排除在外”。此外,使用@Beta注释允许他们测试一些设计选择,而无需提交到特定的API

上面提到的设计选择允许非常紧凑的API。只需看看 MapMaker,就能看到“简单”构建器内部的强大功能。其他很好(尽管更简单?)的例子是CharMatcherSplitterOrdering

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

番石榴正在积极开发中

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

由于谷歌内部严重依赖它,我认为它不会很快消失。此外,开源其通用库使Google能够更轻松地开源依赖于它的其他库(而不是像Guice目前所做的那样重新打包它们)。

结论

由于上述所有原因,番石榴是我开始新项目时的首选库。我非常感谢谷歌和令人敬畏的Guava开发人员,他们创造了这个梦幻般的库。


PS:您可能还想阅读此其他SO问题

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


答案 2

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

优点

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

缺点

  1. 它不足以取代Apache Commons,特别是commons-codec。
  2. 没有“番石榴食谱”。该库既简约又正交。因此,有一个明确的学习曲线来充分利用它。如前所述,Javadoc非常出色,但是一些较长的源代码案例研究会有所帮助。
  3. 如果您处于需要Java 1.3或1.4的环境中,那么您就不走运了。

对我来说,Guava让Java感觉更接近于一种简洁、富有表现力的脚本语言,这很棒。


推荐