
const val是 Kotlin 里最簡單的一個關(guān)鍵字,也是最容易暴露"只用過、沒理解"的點。面試?yán)飭?編譯期常量是什么意思",能答"編譯時直接替換、不進(jìn)內(nèi)存"是及格;能答清二進(jìn)制兼容的坑才是高分——而那個坑在真實項目里造成過線上事故。先把結(jié)論放在前面:const val的值在編譯期被內(nèi)聯(lián)進(jìn)每個使用點,編譯產(chǎn)物里不保留這個字段。由此推出一條關(guān)鍵結(jié)論:它不是二進(jìn)制兼容的——一旦某個庫里的const常量值發(fā)生變化,依賴方即使不重新編譯,運行時拿到的也還是舊值(因為舊值已經(jīng)內(nèi)聯(lián)進(jìn)它的字節(jié)碼了)。這與 Java 的static final恰好相反,是這一題最值得講清楚的地方。機制背后的執(zhí)行路徑先看編譯結(jié)果的差異。假設(shè)有這樣一個常量:object ApiConfig { const val BASE_URL = "https://api.v1.com" val RUNTIME_URL = getUrlFromServer() // 非 const,是運行時初始化 }const val的處理流程是:編譯器解析源碼時求值(必須是編譯期可確定的字面量或常量表達(dá)式),把字面量直接寫進(jìn)每個引用點的字節(jié)碼常量池。字節(jié)碼里沒有ApiConfig.BASE_URL這個字段,