Guava学习总结之- 1 - Basic Utilities - Optional

Guava 作为Google 开发的开源JAVA库之后所以能那么流行,我认为有几点原因 

  1. 可以给开发者提供JDK之外的便利功能,使开发者能够方便的使用一些原先需要自己手写的Utility功能

  2. 可以强制(对就是强制)开发者摒弃一些不好的编程习惯,虽然这些习惯可能是JAVA本身的语言缺陷造成的

  3. 使开发者改进自己的程序模式和架构。这一点可以在 Guava 的 例如 EventBus,Filter, Ordering 等功能加以体现。


从今天开始我将对自己学习的Guava 知识进行梳理和总结。


Optional 

我曾经记得一片文档总结程序设计的10十大天生缺陷, Null 的出现是其中之一。 Google 官方认为 Null 是是出行混乱和未知bug的最主要的来源, 而且null 非常容易造成模棱两可的情况,例如当一个Map的get方法返回null 的时候,你完全不知道是Map中没有这个key值,还是有key值,但是这个key值对应的value是空。 为了应付这个情况, Google 推荐程序中使用Optional最为NULL的替代品。 


下面看Optional 的一个简单的使用例子:

Optional<Integer> possible = Optional.of(5);
possible
.isPresent(); // returns true
possible
.get(); // returns 5


Optional的主旨是用一个非NULL的Object去代替Null的使用,然后用isPresent方法是判断这个Object所带变的对象是否为空。 



如何构造Optional

  1. Optional.of(T)  制定一个非空的值传于of方法,如果传入的值是空,马上报错

  2. Optional.absent() 返回一个代表空对象的Optional

  3. Optiona.fromNullable(T) 传入的对象可以是NULL或者是非NULL的,通过isPresent来判断代表对象是否为空 。



Optional的常用方法

  1. isPresent() 上面提到了很多次, 这里就不多说了

  2. T get() 返回代理对象,注意如果返回值是空的话,就是报IllegalStateException的错误

  3. T or(T) 返回代理对象,但是如果代理对象为空的情况就用参数的值代替返回

  4. T orNull() 返回代理对象,但是如果代理对象为空的情况就用NULL 代替返回

  5. Set<T> asSet() 返回一个只有代理对象的不可变单例的Set (使用Collections.singleton 创建的),但是代理对象为空的话就返回空Set(使用 Collections.emptySet() 创建的)


看到这里你可能觉得好像Optional也没有那么神奇,好像就是一个简单的包装然后读起来稍微方便一点而已, 但是其实就是一个这样的简单的改变就能使强制使你思考如果代理对象为空的时候你应该如何处理。 举个例子 我们有个底层方法: T  get(). 上层使用者可能直接用 T.xxx()的方法而可能造成NullPointerException。 但是如果我们把方法重构为 Optional<T> get(), 那么上层使用者就倾向于会主动的去判断 !isPresent()的情况了。


其他的选择

当然你可能觉得修改现有接口会有很大的改动和风险, 那么Guava还提供了一些便利方法供我们使用

  1. Objects.firstNonNull(T,T) 返回第一个不是NULL的对象

  2. Strings.emptyToNull(String) 把空字符串变为NULL

  3. Strings.NullToEmpty(String) 把NULL变为空字符串

  4. Strings.isNullOrEmpty(String) 这个方法不太好,因为如果你传只有空格的字符串返回是false



你可能感兴趣的:(java,guava)