это безопасно или как-то возможно изменить DataHolder
, используя доступ к этой ссылке? Если да, то как?
Поскольку getData
возвращает значение String
, которое является неизменным, вызывающая сторона не может ничего изменить с помощью возвращенной ссылки. Вы также не можете получить доступ к DataHolder
через String
. Почему String
знает о вашем DataHolder
классе?
есть ли в любом случае мутировать DataSnapshot$1
?
Нет, потому что это анонимный внутренний класс у этого есть только один метод, который возвращает параметр. Параметры передаются по значению , поэтому вам не нужно беспокоиться о том, что вызывающие абоненты изменят свои значения на другой стороне. Это также String
, что означает, что вызывающие абоненты также не будут мутировать объект.
Вы можете спросить об этом, потому что видели, как изменился initialReader
. Ну, поскольку DataHolder$1
является внутренним классом изменяемого DataHolder
, он не является на самом деле неизменным, даже если у него нет методов-мутаторов.
безопасно ли выставлять такие DataHolder$1
или в любом случае нужно связываться с экземпляром DataHolder
из объекта DataHolder$1
?
Нет способа получить доступ к внешнему классу из внутреннего класса , так как в DataHolder$1
нет методов мутатора, вы не можете мутировать DataHolder
извне, только с DataHolder$1
.
Однако, если DataHolder
изменится, изменения отразятся на DataHolder$1
(как показано в вашем примере кода), который, я думаю, побеждает цель неизменности.
Вот как я бы реализовал неизменность в этом сценарии.
Я бы сделал DataHolder
агрегат _Data
. DataHolder
конечно, может это сделать, не так ли? В конце концов, у него есть метод String getData()
! DataHolder
будет иметь метод asReadOnly
, который создает копию this
и возвращает _Data
. На самом деле, я бы переименовал _Data
в ReadOnlyData
.