MutableLiveData si estende da LiveData. I metodi protetti di LiveData possono essere indirizzati solo da sé o da sottoclassi. Quindi in questo caso MutableLiveData essendo una sottoclasse di LiveData può accedere a questi metodi protetti.
Quello che vorresti fare è osservare su un'istanza e vedere se ci sono cambiamenti. Ma allo stesso tempo non vuoi che nessun "estraneo" cambi quell'istanza che stai osservando. In un certo senso questo crea un problema, poiché vorresti avere un oggetto che è e modificabile, per aggiornare qualsiasi nuovo stato, e non modificabile, per assicurarti che nessuno che non dovrebbe può aggiornare questa istanza. Queste due funzionalità sono in conflitto tra loro ma possono essere risolte creando un livello aggiuntivo.
Quindi quello che fai è estendere la tua classe, LiveData, con una classe che può accedere ai suoi metodi. Il sottolivello, in questo caso MutableLiveData, è in grado di accedere ai metodi protetti del suo genitore (/ super).
Ora inizi a creare istanze e crea la tua istanza di osservatore di MutableLiveData. Allo stesso tempo crei un'istanza LiveData che fa riferimento a questa stessa istanza. Poiché MutableLiveData estende LiveData, qualsiasi istanza di MutableLiveData è un oggetto LiveData e può quindi essere referenziato da una variabile LiveData.
Ora il trucco è quasi finito. Esponi solo l'istanza di LiveData, nessuno può usare i suoi metodi protetti, né può lanciarlo al suo super (forse in fase di compilazione, ma non verrà eseguito: errore di RunTime). E mantieni privata l'istanza della sottoclasse effettiva, quindi può essere modificata solo da coloro che possiedono l'istanza, utilizzando i metodi dell'istanza.
//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(.....)
Ora la super classe notifica quando vengono applicate eventuali modifiche.
_name.postValue(...)
Blockquote In generale, una tale forma di ereditarietà (l'aumento della visibilità di alcuni metodi è l'unico cambiamento) una pratica ben nota e quali sono alcuni scenari in cui può essere utile (supponendo di avere accesso a tutto il codice)?
Sì, è abbastanza noto e questo descritto sopra è uno scenario comune. Rimuovere il pattern dell'osservatore e crearlo in una forma set / get ne trarrebbe altrettanto vantaggio. A seconda di dove lo si implementa, nessuna regola d'oro alla fine.
LiveData
è immutabile, poiché il client non può modificare lo stato interno, quindi thread-safe