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

时间:2017-03-15 11:23:08

标签: java kotlin kotlin-lateinit

在Kotlin,假设我有课:

JsonProperty

根据docs

  

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

我可以在 java 代码中使用class MyKotlinClass { lateinit var field: String } myKotlinClass.field。我想禁用字段访问权限,只能通过 getter setter 进行访问。

如何实现此目标并保持 lateinit 修饰符?

3 个答案:

答案 0 :(得分:13)

您可以使用隐藏Java声明的@JvmSynthetic(而不是来自Kotlin)。只需annotate the backing field财产:

@field:JvmSynthetic
lateinit var field: String

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

另见:另一个question about @JvmSynthetic(虽然没有明确答案)。

答案 1 :(得分:2)

这个问题的经典解决方案是使用property delegation

import kotlin.properties.Delegates

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

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

答案 2 :(得分:1)

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

lateinit var field: String
    private set

这种方法的缺点是setter本身在类外无法访问。