繁体   English   中英

如何从Java隐藏Kotlin的lateinit var支持字段?

[英]How to hide Kotlin's lateinit var backing field from Java?

在Kotlin,假设,我有课:

class MyKotlinClass {
    lateinit var field: String
}

根据文件

延迟初始化的属性也作为字段公开。 该字段的可见性将与lateinit属性设置器的可见性相同。

我可以在java代码中使用myKotlinClass.fieldmyKotlinClass.getField() 我想禁用字段访问,只保留通过gettersetter访问。

我怎样才能实现这一目标并保持延迟修饰?

你可以使用隐藏Java声明的@JvmSynthetic (而不是来自Kotlin)。 只需注释属性的支持字段

@field:JvmSynthetic
lateinit var field: String

尽管该字段在字节码中仍然是public的,但它也会有synthetic修饰符,这会阻止它在Java源代码中使用。 但是,该字段似乎仍可通过运行时的反射访问。

另见: 关于@JvmSynthetic另一个问题 (虽然没有明确的答案)。

这个问题的经典解决方案是使用属性委派

import kotlin.properties.Delegates

class MyKotlinClass {
    var field: String by Delegates.notNull()
}

此代码完全符合您在问题中所要求的内容

lateinit字段的可见性来自相应属性的setter的可见性,因此另一个选项是具有非公共setter的属性:

lateinit var field: String
    private set

这种方法的缺点是setter本身在类之外变得不可访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM