2010-06-18 74 views
1

我試圖用Scala作爲現有Java應用程序的一部分,現在我遇到了用setter方法(在這部分代碼中沒有DI框架)注入的依賴關係的問題。這是如何處理斯卡拉方式?用setter函數實現注入

在斯卡拉valvar需要初始化聲明時,但我不能這樣做,因爲Java設置器注入對象,實現一個特定的接口和接口是抽象的,不能實例化。

class ScalaLogic { 
    var service // How to initialize? 

    def setService (srv: OutputService) = { 
    service = srv 
} 

有沒有一種方法來初始化var service,這樣我可以在以後分配的依賴到了嗎?它應該在詞彙範圍內在全班都可見。

回答

2

嘗試使用類Option。這是在Java中使用null的道德等價物。聲明服務,像這樣:

var service: Option[MyInterface] = None 

,並使用

service.get() 

或圖案中使用下劃線匹配

service match { 
    case None => ... 
    case Some[MyInterface] => ... 
} 
+0

是的,已經愛上'Option','Some'和'None'! – puudeli 2010-06-18 20:45:30

5

您可以初始化爲默認值(NULL)。

class ScalaLogic { 
    var service: OutputService = _ 

    def setService (srv: OutputService) = { 
    service = srv 
    } 
} 

有關下劃線的好處(如只使用空反對)是它的工作原理與兩個原語和對象,因此,參數化的類的工作是這樣的:

class ScalaLogic[T] { 
    var service: T = _ 

    def setService (srv: T) = { 
    service = srv 
    } 
} 
+0

+1:很好。不知道。認爲,'Option'類是「模擬」null的方式。 – Dirk 2010-06-18 14:11:50

+0

如果您實際上必須使用'null' /'None'值,則使用'Option'是更好的方法;如果您只需要使用setter方法進行初始化,那麼使用'null'沒有任何問題。 – 2010-06-18 15:52:26

+0

Greenfield代碼可以完全避免使用'Option'的null,但@puudeli明確表示他正在集成現有的Java代碼。 – 2010-06-18 16:47:26

3

在衆多的含義的下劃線是將變量標記爲未初始化的。所以如果你想要一個未初始化的字段,用_初始化它。

要讓字段的getter和setter用@BeanProperty對它進行註釋。編譯器會爲你生成Java風格的getter和setter。

import reflect.BeanProperty 

class ScalaLogic { 
    @BeanProperty 
    var service: OutputService = _ 
} 

順便說一句,規範參照依賴注入在斯卡拉是summary by Jonas Bonér。如果我記得正確,本文不包括基於setter的注入。

+0

Thx,我已閱讀Jonas的文章,你正確回憶,它不包括基於setter的注入:-) – puudeli 2010-06-18 20:34:35