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

时间:2018-01-12 19:38:03

标签: kotlin

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

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

如何添加第二个构造函数,允许我使用序列化的String构造此对象?我希望能够使用

companion object

但是要发现辅助构造函数需要实际覆盖主构造函数。显然,我的辅助构造函数没有任何形状或形式类似于我的主要构造函数。

  • 这里的正确答案是简单地制作一个包含静态deserialize方法的 const result = {}; for(const [key, obj] of Object.entries(quizCorrectAnswer)) result[key] = Array.from({...obj, length:5}, el => !!el); 吗?
  • Kotlin没有办法让多个构造函数接受不同类型的参数吗?
  • 或者问题是我根本不应该有一个主要的构造函数?

2 个答案:

答案 0 :(得分:3)

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

data class

如果您需要equalshashCode / companion object,最好在<td><div class="hidden">...</div></td> 中使用带有工厂方法的主构造函数。

答案 1 :(得分:2)

由于hoursminutesseconds是您班级的属性,您也可以将它们放在主要辅导员中,让辅助电话称为主要辅助人员:

class Time(val hours: Int, val minutes: Int, val seconds: Int) {

    constructor(serializedString: String) : this(
        serializedString.split(":")[0].toInt(),
        serializedString.split(":")[1].toInt(),
        serializedString.split(":")[2].toInt()
    )

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

如果您需要data,请添加data class关键字。

不要担心serializedString.split(":")被调用三次,它不会对性能产生任何重大影响。