Почему LiveData лучше, чем MutableLiveData?

Во многих примерах я вижу следующее:

 class DataViewModel{
         val data:LivaData<Int>
             get() = _data 

         private val _data = MutableLiveData<Int>()

    }

Но проще выглядит так:

 class DataViewModel{
         val data = MutableLiveData<Int>()

    }

Итак, зачем нужна эта более сложная конструкция кода с двумя полями?


person Serg Burlaka    schedule 08.02.2019    source источник
comment
Таким образом, иждивенцы вашей модели просмотра не могут обновлять значение вашего изменяемого объекта живых данных.   -  person JohnnyWineShirt    schedule 09.02.2019
comment
@JohnnyWineShirt, дайте мне более открытый ответ, почему это так важно, пожалуйста   -  person Serg Burlaka    schedule 09.02.2019
comment
Не очень много смысла во всех этих get(). Пользователь по-прежнему может передавать данные в MutableLiveData вне DataViewModel и делать все, что он хочет.   -  person ror    schedule 14.08.2020


Ответы (2)


Это практика, разработанная для ограничения модификации значения извне класса.

LiveData только для чтения. MutableLiveData, как следует из названия, позволяет изменять удерживаемое значение.

Если вы открываете MutableLiveData напрямую, как во втором примере, любой код, который может получить доступ к этому полю data, также может изменить его значение.

Предоставление возможности изменять содержимое data извне класса DataViewModel может затруднить отладку и рассуждать о том, откуда поступает содержимое data в любой момент времени.

person jensck    schedule 08.02.2019

MutableLiveData - это, по сути, LiveData с открытым доступом к двум методам setValue() и postValue() для изменения этих данных.

Следовательно, MutableLiveData необходим, если вы планируете изменять значения LiveData.

Однако в программировании принято делать ваши переменные неизменяемыми или ограничивать доступ тех, кто может изменять данные объекта. Вы бы не хотели предоставлять возможность изменять содержимое переменных внутри объекта, если в этом нет необходимости.

Следовательно, для MutableLiveData мы обычно используем геттер, чтобы получить его родительскую форму, то есть LiveData.

Получая только LiveData, мы можем гарантировать, что те, кто обращается к объекту LiveData, могут только читать значения, хранящиеся внутри, без возможности их изменять.

В некотором смысле, это просто концепция того, почему вы должны использовать частные переменные с геттерами.

person Jackey    schedule 08.02.2019