Создание нескольких конструкторов 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 ?
  • Разве в Котлине нет способа сделать несколько конструкторов, которые принимают разные аргументы?
  • Или проблема в том, что у меня просто не должно быть основного конструктора?

Solutions Collecting From Web of "Создание нескольких конструкторов Kotlin, которые не имеют общих параметров"

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

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