Guava使用有一段时间了,总结一下。
【资源】
官网:http://code.google.com/p/guava-libraries/
>WHY Guava
http://stackoverflow.com/questions/4542550/what-are-the-big-improvements-between-guava-and-apache-equivalent-libraries
>如何学习
目前没有CookBook之类的书,主要资料就是官网的Wiki(强烈推荐)及 几个Google的pdf文档。
这里强调一下Wiki的重要性,API只是说明库的使用,而为什么要实现这些API,有哪些好处就必须阅读上面的资料了。(如wiki中对,NULL值得危害还防御策略,不可变性的好处等都做了细致的论述。)
>QA(国内好像用得还不多,只能推荐英文的了)
http://stackoverflow.com/questions/tagged/guava
【关于依赖包】
有两个,都是引入注解的。
jsr305-1.3.9.jar
大量使用 @Nullable 等,方便FindBugs这样的工具来检测bug。对代码机能无影响。
javax.inject-1.jar
只在 com.google.common.util.concurrent.ServiceManager 类中涉及到注入的内容
【关于代码中的注解】
com.google.common.annotations 下的有这几个注解类经常出现在代码中:
@Beta
这个标识很有意思,它标识此API是"not API-frozen"的,即未来版本中它可能修改或删除。也就是提醒使用者使用它要慎重。
@GwtCompatible / @GwtIncompatible
分别表示GWT兼容 和 GWT不兼容(这个可以无视)
@VisibleForTesting
该类只用于测试代码中
【Guava库特点】
Guava 是Goolge的基础类库,整体质量不必说。有哪些好东西值得学习呢。
1)编码风格包括注释与JDK 高度一致,特别是阅读 com.google.common.collect 感受最为明显。
具备“准JDK”的基本条件。
2)大量使用工厂方法
典型的方法名有:
of() / copyOf()
create() / builder() / newBuilder()
newXXX (XXX为类名)
3)防御性编程的优良典范
Null值防御: 包中 checkNotNull()方法随处可见。
不可变类(Immutablexxx,尽可能使用final)
4)大量使用连缀编程(类似JQuery),程序精简而优雅。又可分为两种:
>用调用自身方法
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000) //配置参数maximumSize
.expireAfterWrite(10, TimeUnit.MINUTES) //配置参数expireAfterWriteNanos
.removalListener(MY_LISTENER) //配置参数removalListener
.build();
一般这类方法最后都有一句“return this”,搜索可以发现,Guava包中有200以上的“return this”。
>用多次构造实现
Splitter.on("\n")
.omitEmptyStrings() //配置参数omitEmptyStrings 设为true
.trimResults(CharMatcher.is('|')) //配置参数trimmer
.limit(5) //配置参数limit
.split(strObject);
上面on() omitEmptyStrings() trimResults() limit() 四个方法分别new Splitter(),只是后者会复用前者的成员变量。
5)其他种种 Effectiv Java
>相比继承更加推荐组合(如:ForwardXXX
集合类,一个装饰模式实现)
>enum 实现单例模式(如:Functions类中 ToStringFunction)
>序列化代理模式(如:LocalCache类中 ManualSerializationProxy)
。。。
【小结】
作为Apache Commons的替代,Guava的起点较高,维护和更新要频繁得多,有Google的强大资源和技术优势,相信未来应用会逐渐超过Commons。