![](/img/trans.png)
[英]isInitialized - Backing field of lateinit var is not accessible at this point
[英]How to hide Kotlin's lateinit var backing field from Java?
在Kotlin,假设,我有课:
class MyKotlinClass {
lateinit var field: String
}
根据文件 :
延迟初始化的属性也作为字段公开。 该字段的可见性将与lateinit属性设置器的可见性相同。
我可以在java代码中使用myKotlinClass.field
或myKotlinClass.getField()
。 我想禁用字段访问,只保留通过getter和setter访问。
我怎样才能实现这一目标并保持延迟修饰?
你可以使用隐藏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.