kotlin 備忘( java 的final static 常量轉換為kotlin 的正確姿勢)
阿新 • • 發佈:2019-01-06
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 -> {
}
}
}
}