创建多个不共享公共参数的 Kotlin 构造函数

JHi*_*son 4 constructor kotlin

假设我有一个可以序列化为字符串的简单数据类:

class Time(val hours: Int, val minutes: Int, val seconds: Int) {
    fun serialize(): String {
        return "%02d:%02d:%02d".format(hours, minutes, seconds)
    }
}
Run Code Online (Sandbox Code Playgroud)

如何添加第二个构造函数来允许我使用序列化字符串构造此对象?我期望能够使用

constructor(serializedString: String) {
    val subs = serializedString.split(":")
    return Time(subs[0].toInt(),subs[1].toInt(),subs[2].toInt())
}
Run Code Online (Sandbox Code Playgroud)

但后来发现辅助构造函数实际上需要重写主构造函数。显然,我的辅助构造函数的形状或形式与我的主构造函数完全不同。

  • 这里的正确答案是简单地创建companion object包含静态deserialize方法的 a 吗?
  • Kotlin 中没有办法创建多个接受不同类型参数的构造函数吗?
  • 或者问题是我根本不应该有主构造函数?

hlu*_*kyi 8

只是不要使用主构造函数。使用两个不同的辅助构造函数:

class Time {

    val hours: Int
    val minutes: Int
    val seconds: Int

    constructor(hours: Int, minutes: Int, seconds: Int) {
        this.hours = hours
        this.minutes = minutes
        this.seconds = seconds
    }

    constructor(serializedString: String) {
       val subs = serializedString.split(":")
       this.hours = subs[0].toInt()
       this.minutes = subs[1].toInt()
       this.seconds = subs[2].toInt()
    }

    fun serialize(): String{
        return "{%02d}:{%12d}:{%22d}".format(hours,minutes,seconds)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要data classequals/hashCode最好在companion object.

  • @Google我认为这是不正确的,据我所知,当您使用主构造函数时,不会自动生成“equals”和“hashCode”。您是否正在考虑[数据类](https://kotlinlang.org/docs/reference/data-classes.html)? (6认同)