Kotlin – 使用“by lazy”与“lateinit”进行属性初始化

Kotlin 库为属性声明提供了两种不同的访问修饰符。

在本文中,我们将重点介绍这两个访问修饰符之间的区别以及我们如何在应用程序中使用它们。

延迟初始化

为了创建一个“lateInit”变量,我们只需要添加关键字“lateInit”作为该变量的访问修饰符。以下是在 Kotlin 中使用“lateInit”需要遵循的一组条件。

  • 将“lateInit”与可变变量一起使用。这意味着,我们需要将“var”关键字与“lateInit”一起使用。

  • "lateInit" 只允许用于非 NULLable 数据类型。

  • “lateInit”不适用于原始数据类型。

  • 当变量属性没有任何gettersetter方法时,可以使用“lateInit”。

示例

我们将声明一个变量为lateInit,我们将看到如何在整个程序中访问它。

class Tutorial {

   lateinit var name : String

   fun checkLateInit(){
      //检查值是否被赋值
      if(this::name.isInitialized)
         println("Your value is not assigned");

      else{
         //初始化名称
         name = "www.nhooo.com/"
         println(this.name)
         //这将返回 true
      }
   }
}

fun main() {
   var obj=Tutorial();
   obj.checkLateInit();
}
输出结果

执行代码后,它将生成以下输出 -

www.nhooo.com/

延迟初始化

为了有效的内存管理,Kotlin 引入了一个称为延迟初始化的新功能。使用lazy关键字时,对象只有被调用时才会创建,否则不会创建对象。lazy()是一个函数,它接受一个 lambda 并返回一个惰性实例,该实例可以用作已应用它的惰性属性的委托。它旨在防止不必要的对象初始化。

  • Lazy 只能用于不可为空的变量。

  • 变量只能是val。不允许使用“var” 。

  • 对象只会被初始化一次。此后,您会从缓存中接收值。

  • 对象在应用程序中使用之前不会被初始化。

示例

在这个例子中,我们将声明一个惰性变量“myName”,我们可以看到对这部分代码的调用只会发生一次,当值被初始化时,它将在整个应用程序中记住该值。一旦使用延迟初始化分配了值,就无法重新分配。

class Demo {
   val myName: String by lazy {
      println("Welcome to Lazy declaration");
      "www.nhooo.com"
   }
}

fun main() {
   var obj=Demo();
   println(obj.myName);
   println("Second time call to the same object--"+obj.myName);
}
输出结果

执行代码后,它将生成以下输出 -

Welcome to Lazy declaration
www.nhooo.com
Second time call to the same object--www.nhooo.com