Java 变量';可运行';必须初始化
为什么Kotlin会对此抱怨:Java 变量';可运行';必须初始化,java,android,kotlin,Java,Android,Kotlin,为什么Kotlin会对此抱怨: class MyActivity : Activity { private var handler:Handler = Handler() private var runnable: Runnable = Runnable { /* Do something very important */ handler.postDelayed(this@MyActivity.runnable, 5000) } } 编译器抱怨说,如果处理程序再
class MyActivity : Activity {
private var handler:Handler = Handler()
private var runnable: Runnable = Runnable {
/* Do something very important */
handler.postDelayed(this@MyActivity.runnable, 5000)
}
}
编译器抱怨说,如果处理程序再次发布变量“runnable”,则必须对该行中的变量“runnable”进行初始化。
这在普通Java中是可行的:
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(runnable, 5000);
}
};
Kotlin认为属性在其初始值设定项结束之前未初始化,因此它不能在其自己的初始值设定项中使用,即使在lambdas中也是如此。这种语义类似于的限制 有几种变通方法:
- 使用它可以引用声明对象的
此
:
这仅适用于作为lambdas替代品的接口,并且总体上不太美观private var runnable: Runnable = object : Runnable { override fun run() { /* Do something very important */ handler.postDelayed(this, 5000) } }
- 使用或搭配:
相同的初始值设定项将用于此声明:
private var runnable: Runnable by Delegates.notNull()
- 自行实施和使用:
class SelfReference<T>(val initializer: SelfReference<T>.() -> T) { val self: T by lazy { inner ?: throw IllegalStateException("Do not use `self` until initialized.") } private val inner = initializer() } fun <T> selfReference(initializer: SelfReference<T>.() -> T): T { return SelfReference(initializer).self }
- 您也可以使用
private var runnable: Runnable = Runnable {
/* Do something very important */
handler.postDelayed(runnable(), 5000)
}
private fun runnable() = runnable
你不担心它是循环引用还是什么吗?我应该担心吗?其背后的想法是,这个Runnable应该每5秒执行一次。还是我遗漏了一些非常明显的东西?!除了函数,您还可以使用只读属性:
private val runnableCopy get()=runnable
private var runnable: Runnable = selfReference {
Runnable {
/* Do something very important */
handler.postDelayed(self, 5000)
}
}
private var runnable: Runnable = Runnable {
/* Do something very important */
handler.postDelayed(runnable(), 5000)
}
private fun runnable() = runnable