概述

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 的 用伴生对象

自动转换的问题

  1. //java中的目标类
  2. public class Logic {
  3. public final static int INDEX_1 = 1;
  4. public final static int INDEX_2 = 2;
  5. }
  6. //自动转换后的kotlin 类 有两种方式。下文用方式2进行描述,类比效果一样
  7. //1
  8. object LogicK {
  9. val INDEX_1 = 1
  10. val INDEX_2 = 2
  11. }
  12. //2
  13. class LogicK2 {
  14. companion object {
  15. val INDEX_1 = 1
  16. val INDEX_2 = 2
  17. }
  18. }

问题:

  1. //kotlin中直接调用 LogicK2 是ok 的没问题
  2. object TestK {
  3. @JvmStatic
  4. fun main(args: Array<String>) {
  5. //普通 赋值
  6. val value = LogicK2.INDEX_1
  7. //常量判断
  8. val index = 1
  9. when (index) {
  10. LogicK2.INDEX_1 -> {
  11. }
  12. }
  13. }
  14. }
  15. //java 中这时候调用LogicK2,赋值是没问题的,但是swich 常量的时候就编译不过去,提示不是常量。而且也不能无缝不改代码的直接调用
  16. //不能直接调用 LogicK2.INDEX_1
  17. public class Test {
  18. public static void main(String[] args) {
  19. //普通 赋值
  20. int value = LogicK2.Companion.getINDEX_1();
  21. //常量判断
  22. int index = 1;
  23. switch (index){
  24. case LogicK.INSTANCE.getINDEX_1():
  25. break;
  26. }
  27. }
  28. }

正确姿势:

  1. class LogicK2 {
  2. companion object {
  3. const val INDEX_1 = 1
  4. const val INDEX_2 = 2
  5. }
  6. }
  7. //正确调用
  8. object TestK {
  9. @JvmStatic
  10. fun main(args: Array<String>) {
  11. //普通 赋值
  12. val value = LogicK2.INDEX_1
  13. //常量判断
  14. val index = 1
  15. when (index) {
  16. LogicK2.INDEX_1 -> {
  17. }
  18. }
  19. }
  20. }