kotlin 內(nèi)聯(lián)類 value class

1. 通過關(guān)鍵詞value+@JvmInline聲明了一個內(nèi)聯(lián)類
//內(nèi)聯(lián)類
//1.4.30 修復(fù)了 init 代碼塊的限制,
//1.5.0 由inline class => value + @jvmInline
//1.8.20 修復(fù)了 二級構(gòu)造的限制
@JvmInline
value class Person(private val fullName: String):PersonX {
    init {
        check(fullName.isNotBlank()) {

        }
    }
    constructor(name: String, lastName: String) : this("$name--$lastName") {
        check(lastName.isNotBlank()){

        }
    }
}

interface PersonX{

}
2. 內(nèi)聯(lián)類的限制

內(nèi)聯(lián)類沒有被當成其他類型使用。
若不滿足這個條件,內(nèi)聯(lián)就會失敗,此時會發(fā)生裝箱,內(nèi)聯(lián)類被當成一個包裝類被構(gòu)建

  • 普通類具備的功能,內(nèi)聯(lián)類幾乎都具備:
    成員變量/方法 & 實現(xiàn)接口
  • 內(nèi)聯(lián)類在保證類型安全的同時能做到了零性能損耗
3.它通常用于約束語義,并以零性能損耗的方式通過編譯器保證類型安全
/**
 *
 * @param second 秒
 */
fun printTime(second:Second){
   println("當前輸入秒 :$second")
}
/**
 *
 * @param minute 分鐘
 */
fun printTime(minute:Minute){
    println("當前輸入分鐘 :$minute")
}


@JvmInline
value class Second(val second: Long)


data class Minute(val minute: Long)

fun main(){
  // 當 kotlin 編譯成 java 后,內(nèi)聯(lián)類型不會被創(chuàng)建,而是將其成員內(nèi)聯(lián)到調(diào)用處
   printTime(Second(1))
  // 構(gòu)建新的包裝對象(在堆中分配內(nèi)存,并在棧中指向這塊內(nèi)存)
   printTime(Minute(1))
}
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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