如何从Java中隐藏Kotlin的lateinit var backing字段?
在Kotlin,假设我有课:
class MyKotlinClass { lateinit var field: String }
根据文档 :
后期初始化属性也暴露为字段。 该字段的可见性将与lateinit属性设置器的可见性相同。
我可以在java代码中使用myKotlinClass.field
或myKotlinClass.getField()
。 我想禁用字段访问,并保持只有通过getter和setter访问。
我怎样才能实现这一点,并保持lateinit修饰符?
你可以使用@JvmSynthetic
来隐藏来自Java的声明(而不是来自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
这种方法的缺点是在二级以外,制定者本身变得难以接近。