kotlin 内联类 value class
2023-05-04 本文已影响0人
中路杀神ai
1. 通过关键词value+@JvmInline声明了一个内联类
//内联类
//1.4.30 修复了 init 代码块的限制,
//1.5.0 由inline class => value + @jvmInline
//1.8.20 修复了 二级构造的限制
@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. 内联类的限制
内联类没有被当成其他类型使用。
若不满足这个条件,内联就会失败,此时会发生装箱,内联类被当成一个包装类被构建
- 普通类具备的功能,内联类几乎都具备:
成员变量/方法 & 实现接口 - 内联类在保证类型安全的同时能做到了零性能损耗
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 后,内联类型不会被创建,而是将其成员内联到调用处
printTime(Second(1))
// 构建新的包装对象(在堆中分配内存,并在栈中指向这块内存)
printTime(Minute(1))
}
image.png