我们目前使用apache集合,字符串utils等。我需要决定是否应该从apache基础实现切换。
重要的标准是开发人员使用的简便性。性能/内存使用对我们来说还不是一个重要的问题。发展速度是目前的关键标准。
我很欣赏有关番石榴开发人员生活变得如此轻松的意见。
答案 0 :(得分:221)
首先,正如 javamonkey79 所解释的那样,虽然Google Guava和Apache Commons确实共享相似的功能,但它们都具有相应功能。因此,将自己限制在只有一个库可能是不明智的。
话虽这么说,如果我不得不选择,我会选择使用Guava,让Apache Commons保持在(Guod)没有所需功能的(罕见)情况下。让我试着解释一下原因。
Apache Commons是一个非常成熟的库,但它也差不多10年了,它的目标是Java 1.4。 Guava是open sourced in 2007,目标是Java 5,因此 Guava极大地受益于Java 5的功能:泛型, varargs , enums ,和 autoboxing 。
根据Guava开发人员的说法,泛型是他们选择创建新库而不是改进Apache Commons的一个原因(参见google-collections FAQ,标题为“为什么Google构建所有这些,当它本来可以尝试改进Apache Commons Collections吗?“)。
我同意他们的观点:虽然经常受到批评(没有具体化,但由于向后兼容性而受到限制),但如果使用得当,Java泛型仍然非常有用非常非常有用。我宁愿退出而不是使用非一般化的集合!
(请注意,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的首席开发人员)在整个图书馆保持高水平的质量/一致性方面做得很好。他当然并不孤单,很多great developers都为Guava做出了贡献(甚至Joshua Bloch,现在在谷歌工作!)。
Guava背后的核心理念和设计选择在整个库中是一致的,开发人员遵循非常好的(IMO)API设计原则,从过去的JDK API错误中学习(不是他们的但是错误。
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即可查看“简单”构建器中的功能。其他好的(虽然更简单?)示例包括CharMatcher,Splitter和Ordering。
组成番石榴的各个部分也很容易。例如,假设您要缓存复杂function的结果?将此函数提供给MapMaker和BINGO,您就拥有了一个线程安全的计算映射/缓存。需要将地图/函数输入约束到特定的字符串?没问题,请将其包含在ConstrainedMap内,使用CharMatcher拒绝不合适的字符串......
虽然Apache Commons的开发似乎已经加速了Commons Lang 3.0的工作,但是Guava似乎在此刻获得了更多的动力,而谷歌开放更多的内部类。
由于谷歌在内部严重依赖它,我认为它不会很快消失。此外,开源其公共库允许Google更轻松地开源依赖它的其他库(而非repackaging它们,如Guice当前does)。
由于上述所有原因,Guava是我开始新项目时的首选图书馆。我非常感谢Google以及创建这个出色图书馆的Guava开发人员。
PS:您可能还想阅读this other SO question
PPS:我还没有任何谷歌股票
答案 1 :(得分:24)
自2010年8月起,我一直在使用番石榴,从r06版本开始。基本上,我有一个绿地java库来开发,所以我四处寻找J2SE API的最佳附属库。传统上,我们使用了Apache Commons库,但我想看看那里有什么并开始使用Guava。
对我来说,Guava让Java感觉更接近一种简洁,富有表现力的脚本语言,这很棒。
答案 2 :(得分:16)
根据我的经验,我并不认为他们彼此抗争,或者番石榴改进了apache libs。相反,番石榴补充 apache库。番石榴中的类和实用程序不在apache中,反之亦然。
因此,我不知道您需要切换本身 - 我会说“使用正确的工具来做正确的工作”。