我正在尝试将Scala用作现有Java应用程序的一部分,现在我遇到了一个使用setter方法注入的依赖项的问题(在这部分代码中没有DI框架)。如何以Scala方式处理?
在Scala中,val
和var
都需要在声明时进行初始化,但我不能这样做,因为Java setter会注入实现某个接口的对象,并且接口是抽象的,不能是实例
class ScalaLogic {
var service // How to initialize?
def setService (srv: OutputService) = {
service = srv
}
有没有办法初始化var service
以便以后可以为其分配依赖项?它应该是词法范围,以便在整个班级中可见。
答案 0 :(得分:5)
您可以使用下划线初始化为默认值(null)。
class ScalaLogic {
var service: OutputService = _
def setService (srv: OutputService) = {
service = srv
}
}
下划线的优点(与使用null相反)是它适用于基元和对象,因此参数化类的工作方式如下:
class ScalaLogic[T] {
var service: T = _
def setService (srv: T) = {
service = srv
}
}
答案 1 :(得分:3)
下划线的许多含义之一是将变量标记为未初始化。因此,如果您想要一个未初始化的字段,请使用_。
进行初始化要为字段设置getter和setter,请使用@BeanProperty对其进行注释。编译器将为您生成Java样式的getter和setter。
import reflect.BeanProperty
class ScalaLogic {
@BeanProperty
var service: OutputService = _
}
顺便说一下,Scala中依赖注入的规范引用是summary by Jonas Bonér。但是,如果我没记错的话,本文不涉及基于setter的注射。
答案 2 :(得分:2)
尝试使用课程Option
。这是在Java中使用null
的道德等价物。像这样声明服务:
var service: Option[MyInterface] = None
并使用
service.get()
或模式匹配
service match {
case None => ...
case Some[MyInterface] => ...
}