2012-04-06 69 views
3

使用來自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())包裝

感謝

+10

順便說一句:你的'安全'方法可以替換爲'Option.apply'。例如:'Option(5)'產生'Some(5)'和'Option(null)'產生'None'。 – dhg 2012-04-06 19:41:52

+1

+1好,很酷,不知道。類型保留,以及我喜歡這種語言;-) – virtualeyes 2012-04-06 19:46:16

+1

當向API調用提供參數的相反方向可以從選項[T]到T(其中T可以爲null)使用Option.orNull,但請記住這不是他與Option.getOrElse(null)相同,因爲它僅限於T <:AnyRef – 2012-04-06 20:55:56

回答

4

正如評論已經提到:

def safe[T](v: T) = Option(v) 

Option(v)相當於:

v match { 
    case null => None 
    case x => Some(x) 
} 

另外,safe方法是不必要的公衆和類的一部分。我會建議簡單地將它內聯。

2)如果這是「」的路要走,什麼是對性能的影響/風險?

通常適應Java傳統API以利用Option是個不錯的主意。我經常用EntityManager.find()這樣做,可以返回null

您的隱式轉換也很好。但是不要在類名中使用下劃線,Java/Scala命名約定更喜歡CamelCase

+0

k,然後在正確的軌道上。 re:在類名中加下劃線,我使用它們的唯一地方就是在這裏,在pimped類中,因爲SomeApiProvidesSomeExtraFunctionality類名對我來說不像下劃線版本可讀 – virtualeyes 2012-04-06 21:09:45