遵循其他语言中的类似模式,我有兴趣在 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)
听起来你正在寻找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)
但请注意,这仅提供编译时类型安全性,因为原始基本类型是在运行时使用的。
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |