春天在Kotlin注入了参考文献

时间:2017-10-13 13:56:13

标签: java spring kotlin

在Kotlin中,变量必须在声明时初始化,除非null附加到类型名称,否则不能?。因此,一个旨在由Spring注入的bean引用必须声明为:

@AutoWired
var someService: SomeService? = null

显而易见的是,从这里到处都使用someService,必须指定某种类型的空安全逻辑,无论是?:还是直接空检查。

我们当然可以这样做:

@AutoWired
var someService = new SomeService()

但这并不总是可行的,一次性实例只是令人困惑。

我的问题是,有没有告诉Kotlin这个变量会被初始化,实际上不是null

2 个答案:

答案 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