Kotlin定义变量一般有如下写法

lateinit var name: String 
var age: String? = null

那么用lateinit 修饰和下面那种有什么区别呢,我们来看一下这两行代码反编译成java代码是什么样子的。

   @NotNull
   public String name;
   @Nullable
   private String age;

   @NotNull
   public final String getName() {
      String var10000 = this.name;
      if (this.name == null) {
         Intrinsics.throwUninitializedPropertyAccessException("name");
      }

      return var10000;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.name = var1;
   }

   @Nullable
   public final String getAge() {
      return this.age;
   }

   public final void setAge(@Nullable String var1) {
      this.age = var1;
   }

可以看到在 name 属性添加了 @NotNull注解,并且在getName和setName方法中进行了非空判断
而 age 属性添加了 @Nullable

当我们调用name的时候,会抛出异常

println(AddStr().name)

Exception in thread “main” kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized

当输出age属性的时候则输出 null

lateinit 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值

Kotlin修饰符lateinit(延迟初始化)案例详解

lateinit不能修饰val变量,只能修饰可变的属性

Kotlin修饰符lateinit(延迟初始化)案例详解

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。