1、概述
java 和kotlin 混合编码已经一段时间了,java中经常在类(或者interface)里写 public final static 常量来代替枚举。
java 的final static 常量转换为kotlin 时,直接用IDE 自动转转的是不够好的。特此记录下
2、结论
java 的final static 常量转换为kotlin 时,要加上 const 关键字,单纯val 修饰是不够的。(java 调用kotlin 的时候就体现出来了,kotlin调用kotlin 体现不出来)
虽然:
1. final 相对 kotlin 的 val (val多了未赋值可赋值一次)。
2. static 相对 kotlin 的 用伴生对象
3、示例
3.1 自动转换的问题
//java中的目标类
public class Logic {
public final static int INDEX_1 = 1;
public final static int INDEX_2 = 2;
}
//自动转换后的kotlin 类 有两种方式。下文用方式2进行描述,类比效果一样
//1
object LogicK {
val INDEX_1 = 1
val INDEX_2 = 2
}
//2
class LogicK2 {
companion object {
val INDEX_1 = 1
val INDEX_2 = 2
}
}
问题:
//kotlin中直接调用 LogicK2 是ok 的没问题
object TestK {
@JvmStatic
fun main(args: Array<String>) {
//普通 赋值
val value = LogicK2.INDEX_1
//常量判断
val index = 1
when (index) {
LogicK2.INDEX_1 -> {
}
}
}
}
//java 中这时候调用LogicK2,赋值是没问题的,但是swich 常量的时候就编译不过去,提示不是常量。而且也不能无缝不改代码的直接调用
//不能直接调用 LogicK2.INDEX_1
public class Test {
public static void main(String[] args) {
//普通 赋值
int value = LogicK2.Companion.getINDEX_1();
//常量判断
int index = 1;
switch (index){
case LogicK.INSTANCE.getINDEX_1():
break;
}
}
}
正确姿势:
class LogicK2 {
companion object {
const val INDEX_1 = 1
const val INDEX_2 = 2
}
}
//正确调用
object TestK {
@JvmStatic
fun main(args: Array<String>) {
//普通 赋值
val value = LogicK2.INDEX_1
//常量判断
val index = 1
when (index) {
LogicK2.INDEX_1 -> {
}
}
}
}