Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量';可运行';必须初始化_Java_Android_Kotlin - Fatal编程技术网

Java 变量';可运行';必须初始化

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) } } 编译器抱怨说,如果处理程序再

为什么Kotlin会对此抱怨:

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中也是如此。这种语义类似于的限制

有几种变通方法:

  • 使用它可以引用声明对象的

    private var runnable: Runnable = object : Runnable {
        override fun run() {
            /* Do something very important */
            handler.postDelayed(this, 5000)
        }
    }
    
    这仅适用于作为lambdas替代品的接口,并且总体上不太美观

  • 使用或搭配:

    相同的初始值设定项将用于此声明:

    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
    }
    

Kotlin认为属性在其初始值设定项结束之前未初始化,因此它不能在其自身的初始值设定项中使用,即使在lambda中也是如此。这种语义类似于的限制

有几种变通方法:

  • 使用它可以引用声明对象的

    private var runnable: Runnable = object : Runnable {
        override fun run() {
            /* Do something very important */
            handler.postDelayed(this, 5000)
        }
    }
    
    这仅适用于作为lambdas替代品的接口,并且总体上不太美观

  • 使用或搭配:

    相同的初始值设定项将用于此声明:

    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
      
      你也可以使用

      private var runnable: Runnable = Runnable {
          /* Do something very important */
          handler.postDelayed(runnable(), 5000)
      }
      
      private fun runnable() = runnable
      

      你不担心它是循环引用还是什么吗?我应该担心吗?其背后的想法是,这个Runnable应该每5秒执行一次。还是我遗漏了一些非常明显的东西?!你不担心它是循环引用还是什么吗?我应该担心吗?其背后的想法是,这个Runnable应该每5秒执行一次。还是我遗漏了一些非常明显的东西?!除了函数,您还可以使用只读属性:
      private val runnableCopy get()=runnable
      而不是函数,您还可以使用只读属性:
      private val runnableCopy get()=runnable