在Kotlin中,变量必须在声明时初始化,除非null
附加到类型名称,否则不能?
。因此,一个旨在由Spring注入的bean引用必须声明为:
@AutoWired
var someService: SomeService? = null
显而易见的是,从这里到处都使用someService
,必须指定某种类型的空安全逻辑,无论是?:
还是直接空检查。
我们当然可以这样做:
@AutoWired
var someService = new SomeService()
但这并不总是可行的,一次性实例只是令人困惑。
我的问题是,有没有告诉Kotlin这个变量会被初始化,实际上不是null
?
答案 0 :(得分:1)
您有两种选择。
1)使用构造函数注入
构造函数注入在我看来是最好的方法,因为它清楚地声明必须设置依赖项来构造对象。
2)将您的字段声明为lateinit
详细了解该文档中的主题: https://kotlinlang.org/docs/reference/properties.html
延迟初始化的属性
通常,声明为非null类型的属性必须是 在构造函数中初始化。然而,通常情况并非如此 方便。例如,可以通过初始化属性 依赖注入,或单元测试的设置方法。在这 case,您不能在构造函数中提供非null初始值设定项,但是 您仍然希望在引用属性时避免空检查 在一个班级的体内。
public class MyTest {
lateinit var subject: TestSubject
@SetUp fun setup() {
subject = TestSubject()
}
@Test fun test() {
subject.method() // dereference directly
}
}
答案 1 :(得分:1)
Spring项目官方建议使用构造函数注入。 在Kotlin中,它看起来像这样:
full_name = Sheet10.Range("A" & row_number).Text
rating = Sheet10.Range("C" & row_number).Text
quality_review = Sheet10.Range("D" & row_number).Text
not_rating_time = Sheet10.Range("E" & row_number).Text
inactive = Sheet10.Range("F" & row_number).Text
absolute_target = Sheet10.Range("G" & row_number).Text
missing = Sheet10.Range("H" & row_number).Text
inactive_comment = Sheet10.Range("I" & row_number).Text