Intereting Posts
Добавление данных в массивList из другого действия Kotlin – Как решить между «lateinit» и «nullable variable»? Как начать аннотация Обработка (kapt) для локальной библиотеки? Как получить доступ к переменной экземпляра в статическом сопутствующем объекте в Koltin Проблемы с настройкой комнаты Kotlin в Android Studio FirebaseRecyclerAdapter – populateViewHolder не получает доступ к данным Настройте проект Spring Boot с Kotlin Использование ресурса в kotlin func – не работает с жирным банком (одна банка) У kotlin coroutines есть асинхронный вызов с таймером? AAR / JAR не генерируется с помощью Android Studio 3.0 Canary 7 Какую ниже технологию я должен узнать теперь, когда разработчик Android будет использовать лучшие возможности в ближайшие дни? Классы Котлина, содержащие андроид-расширения, не построенные на последовательных строках Котлин. Ожидается Любой полученный MyObject Android Kotlin: Смысл бесплатной функции с использованием Mockito / PowerMock Можно ли избежать повторения кода, когда объект должен вернуть измененную копию самого себя?

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