gpt4 book ai didi

constructor - Kotlin数据类便捷构造函数

转载 作者:行者123 更新时间:2023-12-02 13:38:10 25 4
gpt4 key购买 nike

我在Kotlin上还很陌生,我一直坚持制作类似于以下Swift结构的数据类:

struct AppVersion {
let major: Int
let minor: Int
let patch: Int
}

extension AppVersion {
init(version: String) {
let parts = version.split(separator: ".")
let numbers = parts.map { Int($0) ?? 0 }
self.init(major: numbers[0], minor: numbers[1], patch: numbers[2])
}
}

为了清楚起见,我们仅假设 toInt()不抛出,并且版本字符串中始终包含3个组件。

我有两个可行的解决方案。使用伴随对象:
data class AppVersion (val major: Int, val minor: Int, val patch: Int) {
companion object {
fun fromString(version: String): AppVersion {
val parts = version.split(".").map { it.toInt() }
return AppVersion(parts[0], parts[1], parts[2])
}
}
}

或者写一些看起来很糟糕的东西:
data class AppVersion (val major: Int, val minor: Int, val patch: Int) {
constructor(version: String) : this(
version.split(".")[0].toInt(),
version.split(".")[1].toInt(),
version.split(".")[2].toInt()
)
}

但是为便利构造函数使用更长的方法名称似乎很奇怪,而第二个选择则很糟糕。

这样的事情可能吗?
data class AppVersion (val major: Int, val minor: Int, val patch: Int) {
constructor(version: String): this(0, 0, 0) {
val parts = version.split(".").map { it.toInt() }
this(parts[0], parts[1], parts[2])
}
}

最佳答案

super 构造函数调用必须是构造函数的第一条语句,并且只能出现一次。另外,每个val必须精确地初始化一次;您不能将其初始化为0,然后改变主意。这是JVM的限制。

与您的第一个解决方案一样,Kotlin中的惯用解决方案是使用工厂方法。

关于constructor - Kotlin数据类便捷构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51543179/

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