Rap*_*ael 2 constructor immutability kotlin data-class
我正在尝试使用多个构造函数实现不可变数据类.我觉得这样的事情应该是可能的:
data class Color(val r: Int, val g: Int, val b: Int) {
constructor(hex: String) {
assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" } )
val r = hex.substring(1..2).toInt(16)
val g = hex.substring(3..4).toInt(16)
val b = hex.substring(5..6).toInt(16)
this(r,g,b)
}
}
Run Code Online (Sandbox Code Playgroud)
当然,它不是:Kotlin期望对主构造函数的调用在顶部声明:
constructor(hex: String): this(r,g,b) {
assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" } )
val r = hex.substring(1..2).toInt(16)
val g = hex.substring(3..4).toInt(16)
val b = hex.substring(5..6).toInt(16)
}
Run Code Online (Sandbox Code Playgroud)
这也没有用,因为调用是在构造函数体之前执行的,并且无法访问局部变量.
我可以做这个,当然是:
constructor(hex: String): this(hex.substring(1..2).toInt(16),
hex.substring(3..4).toInt(16),
hex.substring(5..6).toInt(16)) {
assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" } )
}
Run Code Online (Sandbox Code Playgroud)
但是这将检查断言太晚,并且不能很好地扩展.
我看到接近所需行为的唯一方法是使用辅助函数(无法在非静态上定义Color):
constructor(hex: String): this(hexExtract(hex, 1..2),
hexExtract(hex, 3..4),
hexExtract(hex, 5..6))
Run Code Online (Sandbox Code Playgroud)
这并不是一种非常优雅的模式,所以我猜我在这里缺少一些东西.
在Kotlin中,是否有一种优雅的,惯用的方法可以在不可变的数据类上建立(复杂的)辅助构造函数?
正如@nhaarman所建议的那样,一种方法是使用工厂方法.我经常使用以下内容:
data class Color(val r: Int, val g: Int, val b: Int) {
companion object {
fun fromHex(hex: String): Color {
assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" } )
val r = hex.substring(1..2).toInt(16)
val g = hex.substring(3..4).toInt(16)
val b = hex.substring(5..6).toInt(16)
return Color(r,g,b)
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用它来调用它 Color.fromHex("#abc123")
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |