inline class(从Kotlin 1.5开始称为value class)允许创建对原始类型的包装,而无需在运行时创建单独的对象。这用于增强类型安全性而不增加内存分配的开销。在底层,这些对象可以编译为相应的原始类型。
示例:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
使用inline/value类对于标识符、货币、单位等的类型化很重要。
值类可以有多个属性吗?
答案: 不可以。值类只能在主构造函数中包含一个属性。
错误代码示例:
@JvmInline value class Money(val amount: Int, val currency: String) // 编译错误
故事
在货币兑换处,使用inline class来描述金额和货币。尝试在值类中添加两个字段时,发生了编译错误,并花了一些时间试图绕过这个限制。最终决定创建单独的data class。
故事
在与外部Java库集成时,inline class有时意外地转换为对象(装箱),影响了性能。经过文档分析,替换为普通的值对象。
故事
在微服务项目中,使用值类作为API中的id。一个服务直接返回字符串,另一个服务返回值类,导致Jackson序列化冲突。通过明确映射id和字符串进行了修复。