java guava和apache等效库之间有哪些重大改进?
我们目前使用apache集合、字符串UTIL等。我需要决定是否应该从apache Foundation实现中切换
重要的标准是开发人员的易用性。性能/内存使用对我们来说还不是一个重要问题。在这一点上,发展速度是关键标准
我会很感激关于开发人员的生活如何变得更容易与番石榴意见
你可以在下面搜索框中键入要查询的问题!
我们目前使用apache集合、字符串UTIL等。我需要决定是否应该从apache Foundation实现中切换
重要的标准是开发人员的易用性。性能/内存使用对我们来说还不是一个重要问题。在这一点上,发展速度是关键标准
我会很感激关于开发人员的生活如何变得更容易与番石榴意见
# 1 楼答案
首先,正如javamonkey79所解释的,虽然Google-Guava和Apache-Commons有相似的特性,但它们也都有其对应产品所没有的功能。因此,将自己局限于一个库可能是不明智的
也就是说,如果我必须选择,我会选择使用Guava,在(罕见的)Guava没有所需功能的情况下保留Apache Commons。让我试着解释一下原因
番石榴更“现代”
ApacheCommons是一个非常成熟的库,但它也有近10年的历史,目标是Java1.4。番石榴是open sourced in 2007,以Java 5为目标,因此番石榴从Java 5的功能中受益匪浅:泛型,变量,枚举,以及自动装箱
根据Guava开发人员的说法,泛型是他们选择创建一个新库而不是改进Apache Commons的原因之一(参见标题下的google-collections FAQ“Google为什么要构建所有这些,而它本可以尝试改进Apache Commons集合?”)
我同意他们的观点:尽管经常受到批评(没有具体化,由于向后兼容性而受到限制),但Java泛型在适当使用时仍然非常有用,就像番石榴一样。我宁愿辞职,也不愿与非泛型集合一起工作
(请注意,Apache Commons 3.0,的目标是Java 1.5+
番石榴的设计/记录非常好
代码中充满了最佳实践和有用的模式,使API更具可读性、可发现性、性能、安全性和线程安全性
阅读了高效Java(非常棒的书,顺便说一句),我在代码中随处可见这些模式:
ImmutableList.copyOf()
)ImmutableList.builder()
,Joiner
,CharMatcher
,Splitter
,Ordering
,…)李>CharMatcher
,Joiner
,Splitter
,…)李>Predicates.xXx
,…)李>ForwardXXX
)我可以花几个小时解释这些设计选择带来的好处(如果你想告诉我的话)。问题是,这些模式不仅仅是“为了展示”,它们还有一个真正的价值:API使用起来很愉快,学习起来也很容易(我忘了说它的文档记录有多好了吗?),效率更高,而且许多类由于其不变性而更简单/线程安全
作为一个额外的点,你可以通过查看代码学到很多:)
番石榴是始终如一的
Kevin Bourrillion(Guava的首席开发人员)在保持整个库的高质量/一致性方面做得很好。当然,他并不孤单,很多人都为番石榴做出了贡献(甚至是现在在谷歌工作的人!)
Guava背后的核心理念和设计选择在整个库中都是一致的,开发人员遵循非常好的(IMO)API设计原则,从JDK API过去的错误中吸取了教训(但不是他们的错误)
番石榴的粉重比很高
番石榴设计师抵制了添加太多特性的诱惑,将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的结果?将此函数提供给mamaker和BINGO,就得到了线程安全的计算地图/缓存。需要将映射/功能输入约束到sp特殊字符串?没问题,将其包装在ConstrainedMap中,使用CharMatcher拒绝不合适的字符串
番石榴正在积极开发中
虽然Apache Commons的开发似乎随着Commons Lang 3.0的开发而加速,但Guava目前似乎获得了更多的动力,而Google则开放了更多内部类的源代码
由于谷歌在内部严重依赖它,我认为它不会很快消失。此外,开源及其公共库允许Google更容易地开源依赖它的其他库(而不是像Guice目前的does那样的repackaging)
结论
出于以上原因,当我开始一个新项目时,Guava是我的首选。我非常感谢谷歌和令人敬畏的Guava开发者,他们创建了这个奇妙的库
PS:您可能还想阅读this other SO question
PPS:我还没有任何谷歌股票
# 2 楼答案
根据我的经验,我不认为它们相互竞争,也不认为guava改进了ApacheLibs。相反,番石榴是对apache libs的补充。guava中有一些类和实用程序不在apache中,反之亦然
因此,我不知道你需要切换本身-我会说“为正确的工作使用正确的工具”
# 3 楼答案
我从2010年8月开始使用番石榴,从r06版本开始。基本上,我有一个新开发的java库要开发,所以我四处寻找J2SEAPI的最佳附属库。传统上,我们使用ApacheCommons库,但我想看看有什么,于是开始使用Guava
专业人士
缺点
对我来说,Guava让Java感觉更接近于一种简洁、富有表现力的脚本语言,这太棒了