kotlin 调用和 init 之间的区别

Pay*_*yar 7 android operator-overloading init invoke kotlin

我正在研究 kotlin 中的运算符重载,并且遇到了invoke方法。当我对它进行研究时,我发现它的工作原理与init每个类的构造函数非常相似。我无法理解其中的差异,它们似乎很相似,因为我们在invoke方法中所做的一切,也可以在构造函数中完成init

那么它们有什么区别以及我们什么时候应该使用它们呢?

小智 7

这不是一个很好的比较。init每次实例化类时都会运行该块,使用我们接下来将看到的任何类型的构造函数。但该invoke方法可以被多次调用,就像该类的任何其他方法一样。假设您想在代码的不同部分将类的所有值作为字符串返回。您可以在 invoke 中实现它,并在任何需要的地方调用它,而无需命名该函数。

例子:

class Person(val name :String,var age:Int) {
    
    fun incrementAge(){
        age =age + 1   
    }

    operator fun invoke():String {
        
        return "name: $name \nage:  $age\n"
    }
}

fun main() {
    
    val x = Person("lionel",35)
    println(x())
    x.incrementAge()
    println(x())
}
Run Code Online (Sandbox Code Playgroud)

输出:

name: lionel 
age:  35

name: lionel 
age:  36
Run Code Online (Sandbox Code Playgroud)