[心得] Java8的Optional心得建議

作者: popcorny (畢業了..@@")   2014-08-05 14:04:52
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
作者: TonyQ (自立而後立人。)   2014-08-05 14:37:00
推~
作者: gmoz ( This can't do that. )   2014-08-05 17:21:00
先推再說 java8好多要學的XD
作者: yyc1217 (somo)   2014-08-05 18:57:00
java8有什麼好書嗎? 雖然網路資料多但還是想看書
作者: qrtt1 (有些事,有時候。。。)   2014-08-05 19:33:00
http://bit.ly/1tRCPsc Java SE 8 技術手冊
作者: swpoker (swpoker)   2014-08-06 09:43:00
我覺得這些應該要用於內部的實作~而非對外的揭露
作者: popcorny (畢業了..@@")   2014-08-06 13:15:00
推樓上,這就是我要表達的意思 :)
作者: swpoker (swpoker)   2014-08-06 16:41:00
例如spring中queryForXXX會拋出非一的錯誤而非回傳null我覺得這個要回歸到本身程式面的流程及錯誤的定義我有改過原本某方法是回傳boolean作為成功或失敗但我確認該回傳的用意是要用來中斷用的->因此我改成錯誤但有些卻用拋出錯誤做為流程的一部分~那就不對了
作者: gmoz ( This can't do that. )   2014-08-06 21:47:00
http://www.codedata.com.tw/tag/jdk8/ 這網站我都還沒看完XD

Links booklink

Contact Us: admin [ a t ] ucptt.com