gpt4 book ai didi

java - Kotlin lateinit 对应java

转载 作者:太空狗 更新时间:2023-10-29 16:29:20 25 4
gpt4 key购买 nike

您好,当我使用 Kotlin 编写 Android 程序时,我在代码中看到了 lateinit。 Java 中的等价物是什么?如何将此代码从 Kotlin 更改为 Java?

public class MyTest {
lateinit var subject: TestSubject
}

最佳答案

Kotlin 中的

lateinit 可以让您可以在创建包含它们的类时无法初始化的变量上拥有不可空类型。

使用您的示例,如果您不使用 lateinit,则必须使 subject 可以为 null,因为它必须使用一个值进行初始化。

public class MyTest {
var subject: TestSubject? = null
}

这将迫使您每次使用它时都进行空值检查,这很丑陋,因此您可以将其标记为 lateinit


在 Java 中,你真的没有这个问题,因为一切都可以为空,并且声明一个未初始化的字段没什么特别的:

public class JavaTest {
TestSubject subject;
}

这会将 subject 初始化为 null,因此它实际上等同于非 lateinit Kotlin 示例。

Kotlin 中的 lateinit 版本和 Java 版本之间唯一真正的区别是,当您尝试访问 Kotlin 中的未初始化属性时,您会得到一个更具体的异常,即 UninitializedPropertyAccessException,这将使调试比查找一般 NullPointerException 的原因更容易。


如果您真的想要这种稍微不同的行为,您可以将您的 Java 属性包装在某种包装器中,但我认为这样做不值得语法开销。一个非常基本的(例如,不是线程安全的)方法是:

有一个通用的属性包装类:

public class Property<T> {

private T value = null;

public T get() {
if (value == null)
throw new UninitializedPropertyAccessException("Property has not been initialized");
return value;
}

public void set(T value) {
if (value == null)
throw new IllegalArgumentException("Value can't be null");
this.value = value;
}

}

在你的类中使用这个包装器:

public class JavaTest {
Property<TestSubject> subject = new Property<>();
}

然后这种用法会给你未初始化的异常:

JavaTest test = new JavaTest();
test.subject.get();

而且这个会运行良好:

JavaTest test = new JavaTest();
test.subject.set(new TestSubject());
test.subject.get();

编辑:这与 lateinit 在 Kotlin 中的工作方式非常相似,如果您将示例的字节码反编译为 Java,将得到以下结果:

public final class MyTest {
@NotNull
public TestSubject subject;

@NotNull
public final TestSubject getSubject() {
TestSubject var10000 = this.subject;
if(this.subject == null) {
Intrinsics.throwUninitializedPropertyAccessException("subject");
}
return var10000;
}

public final void setSubject(@NotNull TestSubject var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.subject = var1;
}
}

基本上,编译器将检查属性访问的代码放在类本身内部(+ 使用一些辅助方法)而不是使用包装器,这样效率更高。

关于java - Kotlin lateinit 对应java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com