在 Kotlin 中,var
是可变的,val
只能分配一次。
但是,请考虑以下示例中的 val foo
:
var counter = 0
val foo: String
get(){
counter++
return "val$counter"
}
fun main(): String {
val a = foo
val b = foo
val c = foo
return "we got: $a $b $c"
// output: we got: val1 val2 val3
}
每次我们尝试访问 foo
时都会执行 get()
方法,从而导致 val 的值不同。
由于 foo
的值在变化,我尝试使用 var
。然后编译器提示“必须初始化属性”。所以我不得不给它一个默认值:
var foo: String = "default value that will never be used"
get(){
counter++
return "val$counter"
}
我不喜欢这两种方法。正确的做法是什么?
最佳答案
In Kotlin, var is mutable and val should be assigned only once.
对于局部变量,是的。对于属性,不是真的:val
表示“只有一个 getter”,var
表示“同时有一个 getter 和一个 setter”。这个getter(和setter)几乎可以做任何事情。例如,您可以每次只返回一个随机值。
一个异常(exception)是为 val
重新分配支持字段:
val foo: Int = 0
get(){
field++
return field
}
不会编译。
关于Kotlin 自定义 Getter 让 `val` 和 `var` 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698928/