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