MutableLiveData поширюється на LiveData. До захищених методів LiveData можна звертатися лише за допомогою власних або підкласів. Тож у цьому випадку MutableLiveData, будучи підкласом LiveData, може отримати доступ до цих захищених методів.
Що ви хотіли б зробити, це спостерігати за екземпляром і перевіряти, чи є якісь зміни. Але в той же час ви не хочете, щоб "сторонні" змінювали той екземпляр, який ви спостерігаєте. У певному сенсі це створює проблему, оскільки ви хотіли б мати об’єкт, який є і змінним, для оновлення будь-якого нового статусу і не змінюється, щоб переконатися, що ніхто, хто не повинен, може оновити цей екземпляр. Ці дві функції конфліктують між собою, але їх можна вирішити, створивши додатковий шар.
Отже, що ви робите, це розширюєте свій клас LiveData класом, який може отримати доступ до своїх методів. Додатковий рівень, в даному випадку MutableLiveData, може отримати доступ до захищених методів свого батьківського (/ super).
Тепер ви починаєте створювати екземпляри та створюєте екземпляр спостерігача MutableLiveData. Одночасно ви створюєте екземпляр LiveData із посиланням на цей самий екземпляр. Оскільки MutableLiveData розширює LiveData, будь-який екземпляр MutableLiveData є об’єктом LiveData, і на нього може посилатися змінна LiveData.
Тепер фокус майже зроблений. Ви виставляєте лише екземпляр LiveData, ніхто не може використовувати його захищені методи, а також не може передати його супер (можливо, під час компіляції, але він не запускається: помилка RunTime). І ви зберігаєте фактичний екземпляр підкласу приватним, тому його можуть змінити лише ті, хто володіє екземпляром, використовуючи методи екземпляра.
//create instance of the sub class and keep this private
private val _name: MutableLiveData<String> = MutableLiveData<String>()
//create an instance of the super class referring to the same instance
val name: LiveData<String> = _name
name.value.observe(.....)
Тепер супер клас повідомляє, коли застосовуються будь-які зміни.
_name.postValue(...)
Блок-цитата Загалом кажучи, чи є така форма успадкування (підвищення видимості певних методів - єдиною зміною) загальновідомою практикою і які сценарії можуть бути корисними (за умови, що ми маємо доступ до всього коду)?
Так, це досить добре відомо, і описане вище є загальним сценарієм. Видаліть шаблон спостерігача і просто зробіть його у форматі set / get, щоб настільки ж виграв від нього. Залежно від того, де ви це впровадите, в підсумку ніяких золотих правил.
LiveData
є незмінним, оскільки клієнт не може змінити внутрішній стан, отже, безпечний для потоків