У меня есть следующий класс Котлин с первичным конструктором,Вторичный синтаксис строительства Котлин
class Person(first: String, last: String, age: Int){
init{
println("Initializing")
}
}
Я хотел бы добавить дополнительный конструктор, который разбирает FULLNAME в first
и last
имя и вызывает первичный конструктор. Тем не менее, я не могу получить правильный синтаксис ...
class Person(first: String, last: String, age: Int){
// Secondary constructor
constructor(fullname: String, age: Int):
this("first", "last", age)
{
println("In secondary constructor")
}
init{
println("Initializing")
}
}
Это прекрасно работает, потому что я на самом деле не разборе fullname
на вторичном конструктору. Когда я пытаюсь разобрать полное имя,
constructor(fullname: String, age: Int):
var first = fullname.split()[0];
...
{
println("In secondary constructor")
}
Я получаю неразрешимую ссылку: полное имя. Она не существует в области видимости, но если я ставлю его в фигурных скобках, то я не могу назвать основной конструктор по this
,
constructor(fullname: String, age: Int):
{
var first = fullname
this(first, "foo", age)
println("In secondary constructor")
}
Я получаю сообщение об ошибке с участием отсутствующего invoke
функции.
Не могу найти хороший пример этого случая на документах Kotlin, извините.
Вы всегда можете выставлять фабричные методы и делегировать их в отличие от конструкторов, позволяя вам решать, когда делегировать или просто не объявлять переменные для 'first' и' last' в вашем втором конструкторе. Но если вы не возражаете, я спрашиваю, почему вы должны разоблачить «Человек (первый, последний, возраст)» И «Лицо (полное имя, возраст)»? Что делать, если клиент забывает добавлять пробел между первым и последним при использовании 'fullName'? Вы не можете объявить переменную перед делегацией конструктора. –
Это просто игрушечный пример, я бы на самом деле не строил эти два конструктора. Вы говорите, что я не могу использовать вторичный конструктор таким образом? В простой Java я думал, что вы можете объявлять переменные во вторичных конструкторах? Поэтому я думаю, что это всего лишь плохой пример, и он бьет по прецеденту, что бы избежать хорошего кодирования? –
Да, вы не можете использовать вторичный конструктор таким образом. 'this' является делегацией, поэтому вы не можете использовать ее в фигурных скобках. Вам нужно что-то сделать по строкам 'constructor (...): this (fullName.split (" ") [0], fullName.split (" ") [1])', который имеет потенциал для индексации границ. –