以下代码报告property must be initialized or be abstract
错误。
// MyApi.kt
interface MyApi {
...
}
// MyFetch.kt
class MyFetch {
private val myApi: MyApi // <- this line
...
}
它可以在可变变量中使用
lateinit
语句,但如何在val中预定义? 最佳答案
关注点分离设计模式将有利于将值传递给构造函数。因此,其他一些实例化您的MyFetch类的类也将实例化您的MyApi实例并将其传递给构造函数:
class MyClass(val myApi: MyApi){
}
//Some higher level class:
val myAPI = object: MyApi { //... }
val myClass = MyClass(myApi)
但是您也可以只在类中对其进行初始化。如果MyApi与MyClass的行为紧密相关,这将是有道理的:
class MyClass {
val myApi = object: MyApi { //... }
}
// or
class MyClass {
val myApi: MyApi
init {
myApi = object: MyApi { //... }
}
}
在这三种情况中的任何一种情况下,都必须在构造函数中,声明中内联或
val
块中分配只读init
属性的值。唯一的其他选择是使用属性委托(delegate)。