【发布时间】:2020-06-05 12:34:34
【问题描述】:
我正在尝试一些 Android 的东西并在学习 Kotlin 的过程中,我想知道如何初始化视图和属性。
据我了解,Kotlin 和 Java 中的合约(“我将在使用前初始化”)以及 UninitializedPropertyAccessException 和 NullPointerException 或多或少是等价的。在这两种情况下,您都可以进行 isInitialized 检查。我只是不知道为什么 JetBrains 会如此费心地考虑 null-safety,然后以不同的形式引入完全相同的东西。
那么,lateinit有什么优势吗?
示例代码:
public class Foo {
private String bar = null;
public void bar123() {
if (bar == null) {
bar = "bar";
}
}
}
对
class Foo {
private lateinit var bar: String
fun bar123() {
if (!::bar.isInitialized) {
bar = "bar"
}
}
}
【问题讨论】:
-
优势在于,由于
var bar被声明为String而不是String?,因此您不需要执行空检查,因此您的代码(即bar)是清洁工 -
但在我看来,if (!::bar.isInitialized) 与空检查几乎相同。我看不出 Kotlin 版本在哪里更干净。
-
@Anonymous,我的意思是在初始化代码(构造函数/构建器/等)之外进行额外的空检查。你避免做所有那些
!!接收者期望String而你传递String? -
@NikolaiShevchenko 好的,在课堂外避免 null 对我来说完全有意义。只是试图返回一个未初始化的属性并得到一个异常。你想提交那个作为答案吗?然后我可以将问题标记为已解决。
-
@Ano.Nymous 一旦初始化,您就不能再将其设置为 null。