2012-08-07 62 views
0

我依靠一箇舊的Java API,它有點吸引人,並且喜歡在缺少數據時拋出空指針異常。我想創建一個具有選項類型訪問器但保留舊訪問者的子類,直到我決定需要爲它們創建安全訪問者。有沒有從原始對象的副本創建子類的好方法?我想實現類似以下內容:使用Scala修飾Java庫對象

SafeIssue extends Issue { 
    def safeMethod: Option[Value] = { //... } 
} 


val issue = oldapi.getIssue() 
val safeIssue = SafeIssue(issue) 

//Preserves issue's methods and data if I need them 
val unsafeVal = safeIssue.unsafeMethod 
val maybeVal = safeIssue.safeMethod 

回答

4

爲什麼不嘗試使用隱式轉換呢?這對於喜歡創建自己的對象的Java API來說效果更好。所以,你會

class SafeIssue(issue: Issue) { 
    def original = issue 
    def safeFoo = Option(issue.foo) 
    // ... You must write any of these you need 
} 
implicit def make_issues_safe(issue: Issue) = new SafeIssue(issue) 

然後你就可以 - 只要您提供的方法 - 寫東西像

val yay = Issue.myStaticFactoryMethodThing.safeFoo.map(x => pleaseNoNull(x)) 

(然後,您可以決定是否要隨身攜帶SafeIssueIssue各地在你的代碼,你可以隨時從SafeIssue找回Issue與暴露original方法(或者你可以使issue參數val

+0

大,這工作就像前pected。這是一個有點迂腐,但我不知道根據你的答案在哪裏把隱式轉換。看着它,在我的情況下,它屬於伴侶對象,但它可以根據情況放在其他地方。 感謝您的回答。 – sbilstein 2012-08-07 18:42:05

+1

@sbilstein這種模式被稱爲「皮條客我的圖書館」。 – 2012-08-08 06:26:24

+1

@ T.Grottker - 對那些堅持詞源完全沒有爭議的人來說,這也是「豐富我的圖書館」。 – 2012-08-08 15:26:18