在Kotlin,假设我有课:
JsonProperty
根据docs:
延迟初始化的属性也作为字段公开。该字段的可见性将与lateinit属性设置器的可见性相同。
我可以在 java 代码中使用class MyKotlinClass {
lateinit var field: String
}
或myKotlinClass.field
。我想禁用字段访问权限,只能通过 getter 和 setter 进行访问。
如何实现此目标并保持 lateinit 修饰符?
答案 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本身在类外无法访问。