Kotlin中的const關(guān)鍵字

前言

Kotlin是一種在Java虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語(yǔ)言,被稱之為Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成為Android官方開(kāi)發(fā)語(yǔ)言

const的特點(diǎn)

經(jīng)過(guò)一段時(shí)間的Kotlin使用,一般來(lái)講我們會(huì)將可變量聲明為var,不可變量聲明為val,并且在符合業(yè)務(wù)的情況下我們推薦使用不可變量去進(jìn)行聲明,可以確保代碼的安全性,我們已經(jīng)可以通過(guò)var val去聲明可變以及不可變量,那么const是做什么用的?

If the value of a read-only property is known at the compile time, mark it as a compile time constant using the const modifier.

按照文檔上的描述,const用于修飾在 編譯時(shí)已知的只讀屬性

  • 用于頂層的聲明,object class 或者 companion object
  • 用于字符串或者基本數(shù)據(jù)類型
  • 沒(méi)有提供get方法

編譯時(shí)已知的只讀屬性,說(shuō)明它的賦值不能是一個(gè)函數(shù),只能是一個(gè)恒定值

val dta = test() //正確
const val DATA = test() //報(bào)錯(cuò)
const val VALUE = ""http://正確
fun test() = ""

只能用于頂層的聲明,object class 或者 companion object

const val TOP_LEVEL_CON = ""
val TOP_LEVEL = ""
object OBJ {
    const val OBJ_CON = ""
    val OBJ_VAL = ""
}
class COM_OBJ {
    val NOR_OBJ =""
    companion object {
        const val COM_CON = ""
        val COM_VAL = ""
    }
}

編譯成Java代碼

public static final String TOP_LEVEL_CON = "";
public static final String TOP_LEVEL = "";
public final class OBJ {
   public static final String OBJ_CON = "";
   public static final String OBJ_VAL = "";
}
public final class COM_OBJ {
   @NotNull
   private final String NOR_OBJ = "";
   @NotNull
   public static final String COM_CON = "";
   @NotNull
   public static final String COM_VAL = "";
}

會(huì)發(fā)現(xiàn)在頂級(jí)聲明,data class以及companion objectconst val都是被編譯成了static final,再看下不同方式聲明的調(diào)用情況,普通類中的val被編譯成了final,看下不同情況下的調(diào)用情況

fun test(){
    println(TOP_LEVEL_CON)
    println(TOP_LEVEL)
    println(OBJ_CON)
    println(OBJ_VAL)
    println(COM_OBJ().NOR_OBJ)
    println(COM_OBJ.COM_CON)
    println(COM_OBJ.CON_VAL)
}

編譯后

public static final void test() {
    String var0 = "";
    System.out.println(var0);
    var0 = TOP_LEVEL;
    System.out.println(var0);
    var0 = "";
    System.out.println(var0);
    var0 = OBJ.INSTANCE.getOBJ_VAL();
    System.out.println(var0);
    var0 = (new COM_OBJ()).getNOR_OBJ();
    System.out.println(var0);
    var0 = "";
    System.out.println(var0);
    var0 = COM_OBJ.Companion.getCON_VAL();
    System.out.println(var0);
}

可以發(fā)現(xiàn)一些區(qū)別,在調(diào)用val時(shí)會(huì)調(diào)用其get方法,但是const會(huì)直接使用賦值,也就是說(shuō)
const在使用的時(shí)候會(huì)有內(nèi)聯(lián)的效果,將值內(nèi)聯(lián)到調(diào)用處,沒(méi)有提供對(duì)應(yīng)的get函數(shù)

Const的使用

基于上述的嘗試,總結(jié)下

  • 只能用于頂層的聲明,object class 或者 companion object中
  • 用于字符串或者基本數(shù)據(jù)類型
  • const在使用的時(shí)候會(huì)有內(nèi)聯(lián)的效果,將值內(nèi)聯(lián)到調(diào)用處,沒(méi)有提供對(duì)應(yīng)的get函數(shù)

我們?cè)贘AVA項(xiàng)目中經(jīng)常會(huì)定義抽離一些公共的 靜態(tài)常量賦值String或者基本數(shù)據(jù)類型 ,提供給 全局的多個(gè)地方頻繁的調(diào)用 ,雖然Kotlin中頂級(jí)聲明,object class 或者 companion object中在的valconst都可以提供靜態(tài)常量給全局使用,但是由于內(nèi)聯(lián)的特性使用const可以避免頻繁的get函數(shù)調(diào)用,在這種情況下推薦使用const

歡迎關(guān)注Mike的簡(jiǎn)書

Android知識(shí)整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容