我正在尝试在Kotlin上重写我的Android应用程序,并且在转换ContentProvider Contract 类时我遇到了问题 . 所以我有简单的 Contract 类(内容类型和内容uris的默认内容被省略):
public final class Contract {
public static final class Contacts {
public static final String NAME = "Name"
public static final String BIRTH = "Birth"
public static final String IMAGE = "Image"
}
}
如果我理解正确,在Kotlin我们没有静态成员 . 而不是这个,我们有“伴侣对象” . 所以在将它转换为Kotlin后,我有这个代码:
object BirthdayContract {
class Contacts : BaseColumns {
companion object {
val NAME = "Name"
val BIRTH = "Birth"
val IMAGE = "Image"
}
}
}
但是当我试图访问像Contract.Contacts.NAME这样的字段时,我有错误:“NAME有私人访问权限” . 更改可见性修饰符不起作用 . 那么有什么方法可以在Kotlin中使用这样的 Contract 类,或者更好地将它保存在Java中?
UPD 我想我应该澄清一下 - 我的来电代码也在Kotlin中 . 问题出在@JvmField注释中 . 有了它,我可以直接访问静态成员,而无需调用getter .
4 回答
NAME
是一个属性,默认情况下,其支持字段具有私有访问权限 . 但是因为它是一个吸气剂:getNAME()
.由于这不是您如何自然地访问Java中的常量,因此有几种方法可以直接显示该字段:
const:
const val NAME = "Name"
@JvmField注释:
@JvmField val NAME = "Name"
要将常量公开为字段,请使用
@JvmField
注释它们然后你可以像这样在Java中使用它们:
一旦您的所有代码都在Kotlin中,您就可以删除@JvmField注释 .
你可以用@JvmStatic来做
到目前为止,我认为没有充分的理由扩展BaseColumns,因此这是一个更好的选择
底线是kotlin中的嵌套对象看起来不干净 . 请考虑简化您的代码
考虑使用普通的 object :
这应该完全填写您的初始Java代码 .
在最新的稳定Kotlin版本 public 是默认的可见性 .
可选地,您可以为编译时常量添加 const 关键字,以便它们可用于注释:https://kotlinlang.org/docs/reference/properties.html#compile-time-constants
@JvmStatic 注释适用于Java-Interop,如果您计划使用完整的kotlin,则不需要它 .