Java8推出了Optional这个东西
目的是要解决NullPointerException
但是可能很多人会想说方法的传回值要使用Optional吗?
还是使用一般的形态?
我的建议基本上跟Ingram的看法很接近
http://ingramchen.io/blog/2014/04/java-8-new-api-tips.html
1. POJO不要回传Optional<T>
因为我认为这就不是POJO了 XD
2. DAO的query如果只有一个回传值
那可以回传Optional<T>
但是一定要有Optional<T>的instance回来
千万不要回传null。
3. DAO回传query如果是一个array
可以使用List<T>
没有值也要回传EmptyList
千万不要回传List<Optional<T>>
也不要Optional<List<T>>
其实我觉得最简单的原则应该是,
方法的传入值,传回值,field都不应该出现Optional
只能出现在local变量,或是只出现在Statement当中
所以上面的item2甚至我都觉得回传不要Optional都比较好
那我的POJO要怎么使用到Optional的好处?
假设以下nested-if的问题
String version = "UNKNOWN";
if(computer != null){
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null){
USB usb = soundcard.getUSB();
if(usb != null){
version = usb.getVersion();
}
}
}
请改用
String version = Optional
.ofNullable(computer)
.map(Computer::getSoundcard)
.map(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
这个是Monad的用法,Monad很难言传,请用意会的。
如果真要讲,就是一般的POJO domain,
转成Optional domain,再回传到POJO domain。
就像傅立叶转换把spatial domain转成frequency domain一样。
这个比喻好像越比喻越复杂(踢飞)
另外对Monad有兴趣的,很建议看这篇。
http://www.slideshare.net/mariofusco/monadic-java
还有良葛格的文章
http://openhome.cc/Gossip/Java/Optional.html