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

比方说,我有一个简单的数据类,可以序列化为一个字符串:

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

我怎样才能添加第二个构造函数,允许我使用序列化的字符串构造这个对象? 我希望能够使用

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

但是来发现次要构造函数需要实际覆盖主构造函数。 显然,我的二级构造函数没有forms或forms类似于我的主要构造函数。

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

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

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

如果您需要data classequals / hashCode ,最好在companion object使用带有工厂方法的主构造companion object

由于hoursminutesseconds是你课程的属性,你可以把他们放在一个主要的construtor,让次要的呼叫主要的:

 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(":")被调用三次,它不应该有任何显着的性能影响。