Kotlin定义变量一般有如下写法
1 2 |
lateinit var name: String var age: String? = null |
那么用lateinit 修饰和下面那种有什么区别呢,我们来看一下这两行代码反编译成java代码是什么样子的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@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的时候,会抛出异常
1 |
println(AddStr().name) |
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized
当输出age属性的时候则输出 null
lateinit 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值lateinit不能修饰val变量,只能修饰可变的属性
到此这篇关于Kotlin修饰符lateinit(延迟初始化)案例详解的文章就介绍到这了,更多相关Kotlin修饰符lateinit(延迟初始化)内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://blog.csdn.net/ldxlz224/article/details/95091943
查看更多关于Kotlin修饰符lateinit(延迟初始化)案例详解的详细内容...