guava和apache等价库之间有哪些重大改进?

Pat*_*Pat 123 java apache-commons guava

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

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

我很欣赏有关番石榴开发人员的生活变得如此轻松的观点.

Eti*_*veu 223

首先,正如javamonkey79所解释的那样,虽然Google Guava和Apache Commons确实共享相似的功能,但它们都具有相应功能.因此,仅限于一个库可能是不明智的.

话虽这么说,如果我不得不选择,我会选择使用Guava,让Apache Commons保持在(罕见)Guava没有所需功能的情况下.让我试着解释一下原因.

番石榴更"现代"

Apache Commons是一个非常成熟的库,但它也差不多10年了,它的目标是Java 1.4.Guava 于2007年开源,面向Java 5,因此Guava从Java 5的特性中获益匪浅:泛型,变量,枚举自动装箱.

根据Guava开发人员的说法,泛型是他们选择创建新库而不是改进Apache Commons的一个原因(请参阅google-collections常见问题解答,标题为"为什么Google构建所有这些,当它可能试图改进Apache时相反,Commons Collections?").

我同意他们的观点:虽然经常受到批评(没有具体化,但由于向后兼容性而受到限制),但如果使用得当,Java泛型仍然非常有用,就像Guava一样.我宁愿退出而不是使用非泛化的集合!

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

番石榴设计得很好/有文件证明

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

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

  • 工厂方法(如ImmutableList.copyOf())
  • 生成器模式(ImmutableList.builder(),Joiner,CharMatcher,Splitter,Ordering,...)
  • 不变性(不变的集合,CharMatcher,Joiner,Splitter,...)
  • 实现隐藏(Predicates.xXx,...)
  • 赞成组合而不是继承(ForwardXXX集合)
  • 空检查
  • 枚举单身模式
  • 序列化代理
  • 经过深思熟虑的命名约定

我可以继续几个小时来解释这些设计选择带来的好处(告诉我你是否想要我).问题是,这些模式不仅仅是"为节目",它们还有一个真正的价值:API是一种使用的乐趣,更容易学习(我忘了说它有多少记录?),更有效,以及由于它们的不变性,许多类更简单/线程安全.

作为奖励点,通过查看代码可以学到很多东西:)

番石榴是一致的

Kevin Bourrillion(Guava的首席开发人员)在整个图书馆保持高水平的质量/一致性方面做得很好.他当然并不孤单,许多优秀的开发人员为Guava做出了贡献(即使是现在在谷歌工作的Joshua Bloch!).

Guava背后的核心理念和设计选择在整个库中是一致的,开发人员遵循非常好的(IMO)API设计原则,从过去的JDK API错误中学习(尽管不是他们的错误).

番石榴具有很高的功率重量比

Guava设计师抵制了添加太多功能的诱惑,将API限制为最有用的功能.他们知道一旦添加功能就很难删除,并遵循Joshua Bloch关于API设计的座右铭:"如有疑问,请将其删除".此外,使用@Beta注释允许他们在不提交特定API的情况下测试一些设计选择.

上面提到的设计选择允许非常紧凑的API.只需查看MapMaker,就可以看到"简单"构建器中包含的功能.其他好的(虽然更简单?)示例是CharMatcher,SplitterOrdering.

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

番石榴正在积极发展

虽然Apache Commons的开发似乎已经加速了Commons Lang 3.0的工作,但Guava目前看起来有了更多的动力,而谷歌开放更多的内部类.

由于谷歌在内部严重依赖它,我认为它不会很快消失.此外,开源其公共库使Google可以更轻松地开源其他依赖它的库(而不是像Guice目前那样重新打包它们).

结论

由于上述所有原因,Guava是我开始新项目时的首选图书馆.我非常感谢Google以及创建这个出色图书馆的Guava开发人员.


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

PPS:我还没有谷歌股票(尚未)


min*_*ryc 24

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

优点

  1. Java 5.0语言构造.该库从Bloch的"Effective Java:2nd Edition"中获取了大部分设计线索:不变性,构建器模式,工厂而非构造函数,泛型等.这使您的代码更紧凑,更具表现力.
  2. 功能编程支持,特别是顶级的Function和Predicate接口.

缺点

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

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


jav*_*y79 16

根据我的经验,我并不认为他们互相竞争,或者番石榴改进了apache libs.相反,番石榴补充了apache libs.番石榴中的类和实用程序不在apache中,反之亦然.

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