gpt4 book ai didi

constructor - 不可变(数据)类上的多个构造函数

转载 作者:行者123 更新时间:2023-12-01 23:14:39 26 4
gpt4 key购买 nike

我正在尝试使用多个构造函数实现不可变数据类。我觉得这样的事情应该是可能的:

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)
}
}

当然不是: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)
}

这也不好,因为调用在构造函数主体之前执行并且无法访问局部变量。

我当然可以这个:

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" } )
}

但这会检查断言太晚,并且不能很好地扩展。

我看到接近所需行为的唯一方法是使用辅助函数(不能在 Color 上定义为非静态):

constructor(hex: String): this(hexExtract(hex, 1..2), 
hexExtract(hex, 3..4),
hexExtract(hex, 5..6))

我觉得这不是一个非常优雅的模式,所以我猜我在这里遗漏了一些东西。

在 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)
}
}
}

然后你可以用 Color.fromHex("#abc123") 调用它

关于constructor - 不可变(数据)类上的多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43030408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com