一旦指定了非空值,将属性从var更改为val的属性?

时间:2016-11-12 11:15:41

标签: kotlin

如果Kotlin添加一个曾经赋值为none null的属性,var属性会更改为val,这意味着你不能再改变这个值了吗?

val? context Context? = null
...
...
...
context = this
...
...
...
context = this.applicationContext //would be an error since context   
                                  //is val 

上面只是一个有用的例子......

3 个答案:

答案 0 :(得分:5)

我认为在这种情况下,这可能是你真正想要的:

val context:Context by lazy { this }

答案 1 :(得分:2)

各种属性"特殊"行为由delegated properties处理。

所有功能请求都应该the official Kotlin issue tracker。实际上,已经有一个请求KT-7180用于您所建议的内容。

这是一个可能的实现(来自问题):

class InitOnceVar<T>() : ReadWriteProperty<Any?, T> {
    private var initialized = false
    private var value: T? = null

    override fun get(thisRef: Any?, desc: PropertyMetadata): T {
        if (!initialized) throw IllegalStateException("Property ${desc.name} should be initialized before get")
        return value
    }

    override fun set(thisRef: Any?, desc: PropertyMetadata, value: T) {
        if (initialized) throw IllegalStateException("Property ${desc.name} could be initialized only once")
        this.value = value
        initialized = false
    }
}

以下是您使用它的方式:

var x: String by InitOnceVar()
x = "star"
x = "stop"  //Exception

答案 2 :(得分:0)

这已经可以了:

fun test() {
  val s : String

  println(s) // Error: Variable 's' must be initialized

  s = "Hello"
  println(s)

  s = "World!" // Error: Val cannot be reassigned
}

否则,没有办法做到这一点。例如,如果您希望将此作为成员属性,则编译器无法知道之前是否已调用方法以及是否允许赋值。

@ ligi的回答是个不错的选择。