Kotlin引入了内联/值类(现在称为值类)的概念,以最小化处理原始类型和小结构的包装时的运行时开销。这个想法借鉴了其他语言(例如C#结构体),在没有失去类型安全的情况下,提高性能。
创建包装类(例如,用于实体类型或标识符)而没有优化会导致内存中出现额外对象,影响性能,GC,并可能导致装箱/拆箱开销。通常希望获得严格的类型(例如,UserId而不是Int),但不实际创建对象。
值类用value修饰符声明。在大多数情况下,JVM不会创建额外的对象——值类直接用其字段替换(内联)。这提供了类型安全和接近“简单Int”的性能。
代码示例:
@JvmInline value class UserId(val value: Int) fun showId(id: UserId) = println(id.value) val id = UserId(15) showId(id) // 没有创建单独的UserId对象
关键特性:
值类可以有多个属性吗?
不,值类只能包含一个属性。
// 错误: // value class Money(val amount: Int, val currency: String)
可以创建具有nullable属性的值类吗?
值类的值字段不能为nullable——只能是非null类型。
// 错误: // value class Name(val value: String?)
可以与值类使用继承吗?
值类不支持继承,不能是抽象类或密封类。
// 错误: // value class NewId(val value: Int): BaseId()
开发者为具有两个属性的实体创建了值类(例如,一对Int和String),导致编译错误。
优点:
开发者将值类用于具有单个字段的标识符类型(例如,UserId),工作快速且安全。
优点: