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