В Kotlin, если мы объявляем член класса как var и допускающий значение NULL тип, компилятор не позволяет нам запускать функцию-член, хотя мы помещаем оператор if перед вызовом функции, поскольку компилятор не может гарантировать, что члену не присвоено значение null после проверки на значение null и перед вызовом метода. Но если мы используем безопасный вызов, компилятор одобряет наш код. Мой вопрос, как компилятор делает безопасный вызов атомарным? Разве второй поток не может изменять переменную между проверкой нулевого значения и вызовом метода (в примере метод eat)? Код для первой ситуации:
class MyWolf
{
var w : Wolf? = Wolf()
fun myFunction()
{
if (w != null)
{
w.eat()
}
}
}
class Wolf
{
fun eat() : Unit
println("wolf is eating")
}
Код для второй ситуации:
class MyWolf
{
var w : Wolf? = Wolf()
fun myFunction()
{
w?.eat()
}
}
class Wolf
{
fun eat():Unit
{
//code
}
}