番石榴和apache等效库之间的重大改进是什么?
我们目前使用apache集合,字符串utils等。我需要决定我们是否应该从apache基础实现切换。
重要的标准是开发人员的易用性。性能/内存使用对我们来说还不是一个重要的问题。在这一点上,发展速度是关键标准。
我很感激关于开发人员的生活如何通过番石榴变得更容易的意见。
我们目前使用apache集合,字符串utils等。我需要决定我们是否应该从apache基础实现切换。
重要的标准是开发人员的易用性。性能/内存使用对我们来说还不是一个重要的问题。在这一点上,发展速度是关键标准。
我很感激关于开发人员的生活如何通过番石榴变得更容易的意见。
首先,正如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()
Joiner
CharMatcher
Splitter
Ordering
CharMatcher
Joiner
Splitter
Predicates.xXx
ForwardXXX
我可以继续几个小时来解释这些设计选择带来的好处(如果你希望我这样做,请告诉我)。问题是,这些模式不仅“为了节目”,它们还有一个真正的价值:API使用起来很愉快,更容易学习(我忘了说它记录得有多好吗?),效率更高,而且许多类由于它们的不变性而更简单/线程安全。
作为奖励点,通过查看代码:)
Kevin Bourrillion(番石榴的首席开发人员)在保持整个库的高质量/一致性方面做得很好。他当然并不孤单,许多伟大的开发人员都为番石榴做出了贡献(甚至是现在在谷歌工作的Joshua Bloch!)。
Guava背后的核心理念和设计选择在整个库中是一致的,开发人员坚持非常好的(IMO)API设计原则,从JDK API过去的错误中吸取了教训(虽然不是他们的错误)。
番石榴设计师抵制了添加太多功能的诱惑,将API限制在最有用的功能上。他们知道一旦添加一个功能就很难删除,并遵循Joshua Bloch关于API设计的座右铭:“当有疑问时,把它排除在外”。此外,使用@Beta注释允许他们测试一些设计选择,而无需提交到特定的API。
上面提到的设计选择允许非常紧凑的API。只需看看 MapMaker,就能看到“简单”构建器内部的强大功能。其他很好(尽管更简单?)的例子是CharMatcher,Splitter和Ordering。
组成番石榴的各个部分也很容易。例如,假设您要缓存复杂函数的结果?将此功能提供给您的MapMaker和BINGO,您将获得线程安全的计算地图/缓存。需要将映射/函数输入限制为特定字符串?没问题,把它包装在一个约束的地图中,使用CharMatcher拒绝不适当的字符串......
虽然Apache Commons的发展似乎已经随着Commons Lang 3.0的工作而加速,但Guava目前似乎获得了更多的动力,而Google开源了更多的内部类。
由于谷歌内部严重依赖它,我认为它不会很快消失。此外,开源其通用库使Google能够更轻松地开源依赖于它的其他库(而不是像Guice目前所做的那样重新打包它们)。
由于上述所有原因,番石榴是我开始新项目时的首选库。我非常感谢谷歌和令人敬畏的Guava开发人员,他们创造了这个梦幻般的库。
PS:您可能还想阅读此其他SO问题
PPS:我(还没有)拥有任何谷歌股票
自2010年8月以来,我一直在使用番石榴,从r06版本开始。基本上,我有一个绿地java库要开发,所以我四处寻找J2SE API的最佳辅助库。传统上,我们使用Apache Commons库,但我想看看那里有什么,并开始使用Guava。
对我来说,Guava让Java感觉更接近于一种简洁、富有表现力的脚本语言,这很棒。