Изменчивость в объекте котлина

#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. очевидно, что это более эффективно, чем решение с синхронизированными функциями. Спасибо