11

假设在 Kotlin 中,我有课:

class MyKotlinClass {
    lateinit var field: String
}

根据文档

Late-Initialized 属性也作为字段公开。该字段的可见性将与 lateinit 属性设置器的可见性相同。

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

我怎样才能做到这一点并保持lateinit修饰符?

4

3 回答 3

15

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

@field:JvmSynthetic
lateinit var field: String

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

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

于 2017-03-15T11:29:26.973 回答
2

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

import kotlin.properties.Delegates

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

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

于 2017-03-15T17:50:44.203 回答
1

字段的可见性lateinit来源于相应属性的 setter 的可见性,因此另一种选择是具有非公共 setter 的属性:

lateinit var field: String
    private set

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

于 2017-03-15T15:21:34.160 回答