Kotlin 自定义 Getter 让 `val` 和 `var` 混淆?

标签 kotlin

在 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/

相关文章:

android - 房间数据库全动态查询

android - 当我从一个 fragment 回到另一个 fragment 时,我的观察者总是开火

java - Kotlin 中构造函数引用的目的是什么

java - 两个 observables 指向同一个引用

android - 使用 Hilt 注入(inject) CoroutineWorker

android - 如何在Android Kotlin中假装单击tabLayout?

kotlin - 为什么我们需要在 Kotlin 中显式的函数接口(interface)修饰符?

kotlin - 如何将粗体、斜体、下划线等格式添加到 Kotlin 文档 (KDoc)

android - 如何在 Kotlin (Android) 中等待 firebase 调用结束

kotlin - 如何使用成员引用在 Kotlin 中创建属性的分层路径