[心得] Java8的Optional心得建議

看板java作者 (畢業了..@@")時間9年前 (2014/08/05 14:04), 9年前編輯推噓6(606)
留言12則, 6人參與, 最新討論串1/3 (看更多)
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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.46.230 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1407218695.A.F06.html ※ 編輯: popcorny (118.163.46.230), 08/05/2014 14:10:35

08/05 14:37, , 1F
推~
08/05 14:37, 1F

08/05 17:21, , 2F
先推再說 java8好多要學的XD
08/05 17:21, 2F

08/05 18:57, , 3F
java8有什麼好書嗎? 雖然網路資料多但還是想看書
08/05 18:57, 3F

08/05 19:33, , 4F
http://bit.ly/1tRCPsc Java SE 8 技術手冊
08/05 19:33, 4F

08/06 09:43, , 5F
我覺得這些應該要用於內部的實作~而非對外的揭露
08/06 09:43, 5F

08/06 13:15, , 6F
推樓上,這就是我要表達的意思 :)
08/06 13:15, 6F

08/06 16:41, , 7F
例如spring中queryForXXX會拋出非一的錯誤而非回傳null
08/06 16:41, 7F

08/06 16:42, , 8F
我覺得這個要回歸到本身程式面的流程及錯誤的定義
08/06 16:42, 8F

08/06 16:43, , 9F
我有改過原本某方法是回傳boolean作為成功或失敗
08/06 16:43, 9F

08/06 16:44, , 10F
但我確認該回傳的用意是要用來中斷用的->因此我改成錯誤
08/06 16:44, 10F

08/06 16:44, , 11F
但有些卻用拋出錯誤做為流程的一部分~那就不對了
08/06 16:44, 11F

08/06 21:47, , 12F
http://www.codedata.com.tw/tag/jdk8/ 這網站我都還沒看完XD
08/06 21:47, 12F
文章代碼(AID): #1Ju7G7y6 (java)
文章代碼(AID): #1Ju7G7y6 (java)