我试图在Kotlin上重写我的Android应用程序,并且在转换ContentProvider合同类时我遇到了问题。 所以我有简单的合同类(内容类型和内容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中使用这样的契约类,还是更好地将它保存在Java中?
UPD 我想我应该澄清一下 - 我的来电代码也在Kotlin中。 问题出在@JvmField注释中。有了它,我可以直接访问静态成员,而无需调用getter。
答案 0 :(得分:6)
NAME
是一个属性,默认情况下,其支持字段具有私有访问权限。但由于它是一个属性,因此它有一个吸气剂:getNAME()
。
由于这不是您如何自然地访问Java中的常量,因此有几种方法可以直接显示该字段:
答案 1 :(得分:2)
要将常量公开为字段,请使用@JvmField
class Contacts {
companion object {
@JvmField val NAME = "Name"
@JvmField val BIRTH = "Birth"
@JvmField val IMAGE = "Image"
}
}
然后你可以像这样在Java中使用它们:
String name = Contacts.NAME;
一旦您的所有代码都在Kotlin中,您就可以删除@JvmField注释。
答案 2 :(得分:0)
考虑使用普通的对象:
cbor_src = [
os.path.join(cborDir,'src/cborparser.c'),
os.path.join(cborDir,'src/cborencoder.c'),
os.path.join(cborDir,'src/cborerrorstrings.c'),
os.path.join(cborDir,'src/cborparser_dup_stirng.c'),
]
这应该完全填写您的初始Java代码。
在最新的稳定Kotlin版本中,公开是默认的可见性。
可选地,您可以为编译时常量添加 const 关键字,以便它们可用于注释:https://kotlinlang.org/docs/reference/properties.html#compile-time-constants
@JvmStatic 注释适用于Java-Interop,如果您计划使用完全kotlin,则不需要它。
答案 3 :(得分:0)
你可以用@JvmStatic
来做object BirthdayContract {
class Contacts : BaseColumns {
companion object {
@JvmStatic val NAME = "Name"
@JvmStatic val BIRTH = "Birth"
@JvmStatic val IMAGE = "Image"
}
}
}
//Java
BirthdayContract.Contacts.Companion.getNAME()
到目前为止,我认为没有充分理由扩展BaseColumns,因此更好的选择
object BirthdayContract {
object Contacts {
const val NAME = "Name"
const val BIRTH = "Birth"
const val IMAGE = "Image"
}
}
//Java
BirthdayContract.Contacts.NAME
底线是kotlin中的嵌套对象看起来不干净。 请考虑简化您的代码