使用來自Scala的Java時,我們必須考慮null。選項 - Java getters
例如,HttpServletRequest getters(getAttribute,getHeader等)都可能返回null。
我知道我可以在每次調用HttpServletRequest方法時手動執行大小寫/匹配或映射操作,但這有點乏味。另外,像request.getHeader(「Accept-Encoding」)這樣的方法調用是滿口的。
我想出了一個濃縮處理這兩個問題:
class Servlet_Request_Provides_NullSafe_Getters (r: HttpServletRequest) {
def header(s: String) = Option(r.getHeader(s))
def attrib(s: String) = Option(r.getAttribute(s))
def remoteHost = Option(r.getRemoteHost)
def accepts = header("Accept-Encoding")
}
implicit def request2Option(r: HttpServletRequest) =
new Servlet_Request_Provides_NullSafe_Getters(r)
1)是否有其他/更好的辦法不是豐富,我的庫來實現相同/相似的影響?
2)如果這是「走」的路,那麼績效影響/風險是什麼?換句話說,這種模式的明顯效用/便利性能夠使人們受到傷害嗎?
對不起,如果這個東西是顯而易見的,只是剛開始豐富的那一天,它真的看起來很有用。只是想確保我將在適當的場景模式......
編輯
@dhg指出,Option.apply()和:
def safe[T](v: T) = v match {
case null => None
case x => Some(x)
}
是等價的,所以getter方法現在使用的選項(F()),而不是我的外部安全(F())包裝
感謝
順便說一句:你的'安全'方法可以替換爲'Option.apply'。例如:'Option(5)'產生'Some(5)'和'Option(null)'產生'None'。 – dhg 2012-04-06 19:41:52
+1好,很酷,不知道。類型保留,以及我喜歡這種語言;-) – virtualeyes 2012-04-06 19:46:16
當向API調用提供參數的相反方向可以從選項[T]到T(其中T可以爲null)使用Option.orNull,但請記住這不是他與Option.getOrElse(null)相同,因爲它僅限於T <:AnyRef – 2012-04-06 20:55:56