有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我们目前使用apache集合、字符串UTIL等。我需要决定是否应该从apache Foundation实现中切换

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

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


共 (3) 个答案

  1. # 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()JoinerCharMatcherSplitterOrdering,…)
    • 不变性(不可变集合,CharMatcherJoinerSplitter,…)
    • 实现隐藏(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就可以看到“简单”构建器中的电源。其他好处(尽管更简单?)例如CharMatcherSplitterOrdering

    制作番石榴的各个部分也很容易。例如,假设您想要缓存复杂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. # 2 楼答案

    根据我的经验,我不认为它们相互竞争,也不认为guava改进了ApacheLibs。相反,番石榴是对apache libs的补充。guava中有一些类和实用程序不在apache中,反之亦然

    因此,我不知道你需要切换本身-我会说“为正确的工作使用正确的工具”

  3. # 3 楼答案

    我从2010年8月开始使用番石榴,从r06版本开始。基本上,我有一个新开发的java库要开发,所以我四处寻找J2SEAPI的最佳附属库。传统上,我们使用ApacheCommons库,但我想看看有什么,于是开始使用Guava

    专业人士

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

    缺点

    1. 它不足以替代Apache Commons,尤其是Commons编解码器
    2. 没有“番石榴食谱”。这个图书馆既简约又正交。因此,有一个明确的学习曲线来充分利用它。如前所述,Javadoc非常优秀,但是一些较长的源代码案例研究会有所帮助
    3. 如果您所处的环境需要Java1.3或1.4,那么您的运气就不好了

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