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)類沒有被當(dāng)成其他類型使用巷屿。
若不滿足這個條件崇众,內(nèi)聯(lián)就會失敗省核,此時會發(fā)生裝箱扰藕,內(nèi)聯(lián)類被當(dāng)成一個包裝類被構(gòu)建
- 普通類具備的功能,內(nèi)聯(lián)類幾乎都具備:
成員變量/方法 & 實現(xiàn)接口 - 內(nèi)聯(lián)類在保證類型安全的同時能做到了零性能損耗
3.它通常用于約束語義芳撒,并以零性能損耗的方式通過編譯器保證類型安全
/**
*
* @param second 秒
*/
fun printTime(second:Second){
println("當(dāng)前輸入秒 :$second")
}
/**
*
* @param minute 分鐘
*/
fun printTime(minute:Minute){
println("當(dāng)前輸入分鐘 :$minute")
}
@JvmInline
value class Second(val second: Long)
data class Minute(val minute: Long)
fun main(){
// 當(dāng) 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))
}