- 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 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值
- lateinit不能修饰val变量,只能修饰可变的属性
版权声明:本文为ldxlz224原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。