我有一個主構造以下科特林類,二級構造語法科特林
class Person(first: String, last: String, age: Int){
init{
println("Initializing")
}
}
我想補充一點,解析全稱成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中,我認爲你可以在二級構造函數中聲明變量?所以我想這僅僅是一個不好的例子,而且它打擊了一個良好編碼會避免的用例? –
是的,你不能以這種方式使用二級構造函數。 '這是'代表團,這就是爲什麼你不能在大括號內使用它。你必須按照'constructor(...):this(fullName.split(「」)[0],fullName.split(「」)[1])'的方式做一些事情,這有可能被索引出來的界限。 –