我正在尝试将以下代码转换为Kotlin,并且仍然使用Java使用的一个类(Foo) . 进行此转换的正确方法是什么?
原始Java:
public class Foo {
public static final String C_ID = "ID";
public static final String C_NAME = "NAME";
public static final String[] VALUES = {"X", "Y", "Z"};
public static String[] getAll() {
return new String[] {C_ID, C_NAME};
}
}
public class Bar {
public void doStuff() {
String var1 = Foo.C_ID;
String[] array1 = Foo.VALUES;
String[] array2 = Foo.getAll();
}
}
自动转换Foo到Kotlin
object Foo {
val C_ID = "ID"
val C_NAME = "NAME"
val VALUES = arrayOf("X", "Y", "Z")
val all: Array<String>
get() = arrayOf(C_ID, C_NAME)
}
问题:
Bar类无法再访问C_ID或VALUES(错误:“私有访问”)
如果我把“const”放在C_ID前面,它可以工作......但我不能对VALUES做同样的事情(“const”只能用于primatives或String)
我应该采用不同的方式(因此Java代码和Kotlin代码都可以访问Foo中的所有内容)吗?
4 回答
目前的语义来自Kotlin Beta Candidate:
根据这个和reference,有三种方法可以处理来自Java的Kotlin
object
的属性:Foo.INSTANCE
.默认情况下,
object
的属性不是Java的静态字段,但Java可以通过Foo
对象实例 -Foo.INSTANCE
访问属性 .所以表达式将是
Foo.INSTANCE.getC_ID()
.@JvmStatic
注释标记属性:这将为
C_ID
而不是Foo
实例getter生成静态getter,它将作为Foo.getC_ID()
访问 .@JvmField
注释:这将使Kotlin编译器为Java而不是属性生成静态字段 . 然后在Java中,您可以将其作为静态字段访问:
Foo.C_ID
.但是,如果没有像示例中的
all
这样的字段,它将不适用于属性 .对于原语,如你所说,可以使用
const
,就Java中的可见性而言,它将具有与@JvmField
相同的效果 .顺便说一句,当涉及到方法时,情况是相同的,并且它们有
@JvmStatic
注释 .在你的foo类中,你可以将这些属性和方法放在一个伴侣对象中:
然后你可以调用Foo.getAll()和Foo.C_ID,Foo.C_NAME和Foo.VALUES .
您应该能够访问“kotlin方式”的值:
结果如下:
如果你为常量创建新的kotlin文件会更好 .
创建 Constants.kt 文件并粘贴到代码下方 .
在您的主要活动中,您可以通过常量名称访问常量,android studio将自动导入常量 . 这是我的mainActivity:
我能够成功获得日志输出