MutableLiveData se está extendiendo desde LiveData. Los métodos protegidos de LiveData solo pueden ser abordados por uno mismo o subclases. Entonces, en este caso, MutableLiveData, que es una subclase de LiveData, puede acceder a estos métodos protegidos.
Lo que le gustaría hacer es observar una instancia y ver si hay algún cambio. Pero al mismo tiempo, no desea que ningún "extraño" cambie la instancia que está observando. En cierto sentido, esto crea un problema, ya que le gustaría tener un objeto que sea y modificable, para actualizar cualquier estado nuevo, y no modificable, para asegurarse de que nadie que no deba pueda actualizar esta instancia. Estas dos características entran en conflicto entre sí, pero se pueden resolver creando una capa adicional.
Entonces, lo que hace es extender su clase, LiveData, con una clase que puede acceder a sus métodos. La subcapa, en este caso MutableLiveData, puede acceder a los métodos protegidos de su padre (/ super).
Ahora comienza a crear instancias y crea su instancia de observador de MutableLiveData. Al mismo tiempo, crea una instancia de LiveData que hace referencia a esta misma instancia. Debido a que MutableLiveData extiende LiveData, cualquier instancia de MutableLiveData es un objeto LiveData y, por lo tanto, una variable LiveData puede hacer referencia a ella.
Ahora el truco está casi hecho. Expone solo la instancia de LiveData, nadie puede usar sus métodos protegidos, ni puede convertirlo en su super (tal vez en tiempo de compilación, pero no se ejecutaría: error RunTime). Y mantiene la instancia de la subclase real privada, por lo que solo pueden cambiarla aquellos que son propietarios de la instancia, utilizando los métodos de la instancia.
//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(.....)
Ahora la superclase notifica cuando se aplican cambios.
_name.postValue(...)
Blockquote En términos generales, ¿es esta forma de herencia (el aumento de la visibilidad de ciertos métodos es el único cambio) una práctica bien conocida y cuáles son algunos escenarios en los que puede ser útil (asumiendo que tenemos acceso a todo el código)?
Sí, es bastante conocido y esto descrito anteriormente es un escenario común. Eliminar el patrón de observador y hacerlo en una forma set / get sería igualmente beneficioso para él. Dependiendo de dónde lo implementes, al final no habrá reglas de oro.
LiveData
es inmutable, ya que el cliente no puede cambiar el estado interno, por lo tanto, seguro para subprocesos