Kotlin中的Inline Class
Inline Class
@JvmInline
value class ErrorCode (code: Int)
Kotlin中在类声明处使用 value 关键字即可声明一个Inline Class,Inline Class的主构造函数有且仅有一个参数。后续对Inline Class对象的使用,在运行时会将其替换成对其主构造函数中的对应参数的使用。
如果要在Java代码中也能使用Kotline中的生命的Inline Class,需要额外增加@JvmInline 注解。
在Inline Class中可以像普通类一样声明成员变量和函数,但是Inline Class中的成员变量不能拥有 backingField, 即必须是无状态的。
另外,Inline Class不能继承自其他的类型(可以实现其他接口),也不能作为父类被其他类型继承。
使用示例
Kotlin中使用Inline Class的经典示例即 UInt 类
public value class UInt internal constructor(@PublishedApi internal val data: Int)
UInt 类表示无符号整型,实际是对于 Int 类的封装,最终在运行时会被替换成 Int 来使用。
UInt 类提供了许多 static 的方法来实现对无符号整型的操作。
Inline Class在某种程度上与 typealias 关键字很相似,但与 typealias 不同的是Inline Class是真实存在的类型,而 typealias 关键字只是为某个类引入了其他别名。
Inline Class 与其包装的类型是不同的两个类型,但 typealias 声明的类本质上与其原始名称的类型是同一个类型,在编译之后会被替换成其别名的原始类型。
typealias 的典型使用场景是处理在同一个文件中类名冲突的两个类,可以使用 typealias 来为其中一个类引入别名,这样就可以避免使用完整的类路径名。
例如:
import java.lang.String
import com.test.String
typealias TestString = com.test.String