Создание нескольких конструкторов 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()) } 

Но приходите, чтобы выяснить, что вторичные конструкторы должны фактически переопределить первичный конструктор. Очевидно, что мой вторичный конструктор никоим образом не является формой или формой, похожей на мой основной конструктор.

  • Правильный ответ здесь – просто создать companion object , содержащий статический метод deserialize ?
  • Разве в Котлине нет способа сделать несколько конструкторов, которые принимают разные аргументы?
  • Или проблема в том, что у меня просто не должно быть основного конструктора?

Просто не используйте первичный конструктор. Используйте два разных дополнительных конструктора:

 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 class и equals / hashCode , лучше использовать первичный конструктор с заводским методом в companion object .

Поскольку hours , minutes и seconds являются свойствами вашего класса, вы можете также помещать их в основной конструктор и позволять второму вызову первичный:

 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(":") вызывается три раза, он не должен оказывать существенного влияния на производительность.