#kotlin #constructor
Вопрос:
Основной вопрос. У меня есть первичный и вторичный конструктор, и внутри вторичного конструктора я вычисляю/извлекаю первичные конструкторы
Это проблема, так как, насколько мне известно, вам нужно немедленно вызвать основной конструктор внутри второго.
Вот так
constructor() : this(/*parameters for primary constructor*/)
Однако я не могу вызвать основной конструктор, потому что я еще не знаю параметров.
constructor() : this(/*???*/) { //find parms of primary constructor //i want to call primary constructor here }
Можно ли позже вызвать основной конструктор во вторичном конструкторе?
Есть ли лучший способ структурировать это, чтобы избежать этой проблемы?
Вот упрощенный пример
class Test(var name: String,var age: String,var dateOfBirth: String){ constructor(id: String) : this(/*???*/) { //get name, age, dob, from id I want to call the primary constructor here since } }
Моим лучшим решением было просто отправить пустые/нулевые значения в основной конструктор, а затем изменить их в теле конструктора
constructor(id: String) : this(null,0,null) { name = age = dateOfBirth = }
Это работает, но мне было интересно, есть ли лучший способ
Вполне вероятно, что существует гораздо лучший способ структурировать все это, который позволил бы полностью избежать этой проблемы, так что дайте мне знать, если это так!
Комментарии:
1. По определению, код вторичного конструктора занимает второе место. Альтернативный дизайн состоит в том, чтобы вообще не иметь основного конструктора. Вместо этого у вас есть частная конечная функция, которую каждый из ваших конструкторов вызывает в какой-то момент. Возможно, вам придется пометить ваши ненулевые свойства позже, потому что вы устанавливаете их косвенно (по телефону и не можете легко проверить). Вторичный альтернативный дизайн состоял бы в том, чтобы поместить фабричную функцию в сопутствующий объект вместо создания вторичного конструктора. И если вы сделаете функцию фабрики функцией вызова оператора, она будет использовать тот же синтаксис, что и конструктор.
Ответ №1:
Вам следует избегать использования каких-либо вычислений внутри конструктора. В целом это плохая практика. Мое предложение для вас-использовать функции конструктора. Что-то вроде:
class Test( var name: String, var age: String, var dateOfBirth: String) { companion object { fun fromId(id: Long): Test { //calculations return Test("", "", "") } } }
Ответ №2:
Вам не нужно все это. Объявляйте переменные на верхнем уровне класса и устанавливайте значения после их вычисления.
class Sample(val n: Int, val m: Int) { private val sum: Int init { sum = n m } }
Затем каждый раз, когда вы инициализируете класс, будет вычисляться значение вашей переменной