我有以下kotlin类与主要构造函数,
class Person(first: String, last: String, age: Int){
init{
println("Initializing")
}
}
Run Code Online (Sandbox Code Playgroud)
我想添加一个辅助构造函数,它将一个fullname解析为a first和lastname并调用主构造函数.但是,我无法正确理解语法...
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")
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,因为我实际上fullname并没有在辅助构造函数中进行解析.当我继续尝试解析全名时,
constructor(fullname: String, age: Int):
var first = fullname.split()[0];
...
{
println("In secondary constructor")
}
Run Code Online (Sandbox Code Playgroud)
我得到一个未解决的参考:全名.它在范围内不存在,但是如果我把它放在括号中,那么我不能通过调用主构造函数this,
constructor(fullname: String, age: Int):
{
var first = fullname
this(first, "foo", age)
println("In secondary constructor")
}
Run Code Online (Sandbox Code Playgroud)
我得到一个涉及缺失invoke功能的错误.
对不起,在Kotlin docs上找不到这个案例的好例子.
当我想要一个需要在将结果传递给主构造函数之前执行一些计算的辅助构造函数时,我使用的解决方案是使用伴生对象上的函数。执行此操作的代码如下所示:
class Person(first: String, last: String, age: Int) {
companion object {
fun fromFullNameAndAge(fullname: String, age: Int) : Person {
println("In secondary constructor")
var bits = fullname.split()
// Additional error checking can (and should) go in here.
return Person(bits[0],bits[1],age)
}
}
init{
println("Initializing")
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它
var p = Person.fromFullNameAndAge("John Doe", 27)
Run Code Online (Sandbox Code Playgroud)
这并不那么整洁,Person("John Doe", 27)但在我看来还不错。
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |