前言
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.
- Top-level, or member of an
objectdeclaration or a companion object. - Initialized with a value of type
Stringor a primitive type - No custom getter
按照文檔上的描述,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 object中const 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中在的val與const都可以提供靜態(tài)常量給全局使用,但是由于內(nèi)聯(lián)的特性使用const可以避免頻繁的get函數(shù)調(diào)用,在這種情況下推薦使用const
歡迎關(guān)注Mike的簡(jiǎn)書
Android知識(shí)整理