在 Kotlin 中对原语进行强类型化的最佳方法

uv_*_*uv_ 0 kotlin

遵循其他语言中的类似模式,我有兴趣在 Kotlin 中生成对原始类型进行强类型化的最有用的方法。

当然,其基本原理是拥有两种基本类型(例如字符串),但不能错误地相互分配。

我的最新尝试在这里给出,我有兴趣知道如何进一步最小化它(可以省略定义派生构造函数吗?)

abstract class StronglyTyped<T>{
    private var value: T
    constructor(_value: T) {
        value = _value
    }
    operator fun invoke(): T {
        return value
    }
}

class UserId: StronglyTyped<String> {
    constructor(_value: String): super(_value) {}
}

class UserName: StronglyTyped<String> {
    constructor(_value: String): super(_value) {}
}

fun main() {
    val a = UserId("this is a userId")
    val b = UserName("this is a userName")
    var c: UserName
    //c = a // <== won't compile
    c = b
    println(c())
}
Run Code Online (Sandbox Code Playgroud)

End*_*eit 5

听起来你正在寻找value classes. 更多信息可参见官方文档

示例可能如下所示:

value class Password(val value: String) 
Run Code Online (Sandbox Code Playgroud)

如果您想对原语强制执行某些验证,可以在init块内执行此操作。

value class UserId(val value: String) {
    init {
        require(value.length == 8) { "A userId must be exactly 8 characters long!" }
    }
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这仅提供编译时类型安全性,因为原始基本类型是在运行时使用的。