如果Kotlin添加一个曾经赋值为none null的属性,var属性会更改为val,这意味着你不能再改变这个值了吗?
val? context Context? = null
...
...
...
context = this
...
...
...
context = this.applicationContext //would be an error since context
//is val
上面只是一个有用的例子......
答案 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的回答是个不错的选择。