Вы не можете провести четкое различие между val
с пользовательским геттером и без него.Если вы смешаете эти два вместе, как в вашем вопросе, то val
не является потокобезопасным;однако Kotlin делает это различие, как вы можете наблюдать в этом примере:
val simpleVal: Int? = 3
val customVal: Int? get() = simpleVal
fun main(args: Array<String>) {
if (simpleVal != null) {
println(simpleVal + 1)
}
if (customVal != null) {
println(customVal + 1) // ERROR!
}
}
Ошибка: (12, 21) Kotlin: Интеллектуальное приведение к Int невозможно, потому что customValсвойство, имеющее открытый или пользовательский метод получения
. Интеллектуальное приведение не разрешено, в том числе из-за возможной мутации другого потока в результате пользовательского вызова get()
.
Следовательно:
- Простой
val
является поточно-ориентированным; - A
val
с пользовательским или открытым геттером (не обязательно) не является поточно-ориентированным.