1. 程式人生 > >kotlin 備忘( java 的final static 常量轉換為kotlin 的正確姿勢)

kotlin 備忘( java 的final static 常量轉換為kotlin 的正確姿勢)

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 -> {
            }
        }
    }
}