#kotlin #concurrency #synchronized
Вопрос:
Я изучаю особые случаи изменчивости в Котлине.
это код, с которым я играл:
var a = 350 val b = a a = 8 println(b) // 350. ===> should be 8
Я хочу сохранить значение b
as val, но в то же время оно должно иметь возможность принимать значение a
при каждом a
изменении переменной.
Поэтому я попробовал объектное решение, но, как вы видите ниже, x
переменная недоступна. Я полагаю, что это решение неверно.
val object1 = object { var x = 350 } val object2 = object1 object1.x = 8 println(object2.x)
Есть ли способ синхронизировать это x
, но без помещения блока в синхронизированную аннотированную функцию, как показано ниже ?
@Synchronized fun someFunction(): Int { val object1 = object { var x = 350 } val object2 = object1 object1.x = 8 println(object2.x) return object2.x } someFunction()
Комментарии:
1. Зачем вам нужно синхронизировать его? безопасно устанавливать свойство одновременно (до тех пор, пока за ним не стоит какая-то логика).
Ответ №1:
Вы можете просто определить b
как свойство, которое ссылается a
:
var a=350 val b: Int get()=a
Каждый раз , когда вы получаете доступ b
, он перенаправляет этот доступ на a
.
Будет напечатано следующее 8
, и вам не нужно будет использовать свое объектное решение:
var a=350 val b: Int get()=a fun main() { a=8 println(b) }
Комментарии:
1. очевидно, что это более эффективно, чем решение с синхронизированными функциями. Спасибо