MutableLiveData est une extension de LiveData. Les méthodes protégées de LiveData ne peuvent être adressées que par soi-même ou par des sous-classes. Donc, dans ce cas, MutableLiveData étant une sous-classe de LiveData peut accéder à ces méthodes protégées.
Ce que vous aimeriez faire, c'est observer sur une instance et voir s'il y a des changements. Mais en même temps, vous ne voulez pas que des "étrangers" modifient cette instance que vous observez. Dans un sens, cela crée un problème, car vous aimeriez avoir un objet qui soit et modifiable, pour mettre à jour tout nouveau statut, et non modifiable, pour vous assurer que personne qui ne devrait pas peut mettre à jour cette instance. Ces deux fonctionnalités sont en conflit l'une avec l'autre, mais peuvent être résolues en créant une couche supplémentaire.
Donc, ce que vous faites est d'étendre votre classe, LiveData, avec une classe qui peut accéder à ses méthodes. La sous-couche, dans ce cas MutableLiveData, est capable d'accéder aux méthodes protégées de son parent (/ super).
Vous commencez maintenant à créer des instances et créez votre instance d'observateur de MutableLiveData. En même temps, vous créez une instance LiveData faisant référence à cette même instance. Comme MutableLiveData étend LiveData, toute instance de MutableLiveData est un objet LiveData et peut donc être référencée par une variable LiveData.
Maintenant, le tour est presque terminé. Vous exposez uniquement l'instance LiveData, personne ne peut utiliser ses méthodes protégées, ni ne peut la convertir en son super (peut-être au moment de la compilation, mais elle ne fonctionnerait pas: erreur RunTime). Et vous gardez l'instance de sous-classe réelle privée, de sorte qu'elle ne peut être modifiée que par ceux qui possèdent l'instance, en utilisant les méthodes de l'instance.
//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(.....)
Désormais, la super classe avertit lorsque des modifications sont appliquées.
_name.postValue(...)
Blockquote D'une manière générale, une telle forme d'héritage (l'augmentation de la visibilité de certaines méthodes étant le seul changement) est-elle une pratique bien connue et quels sont certains scénarios où cela peut être utile (en supposant que nous ayons accès à tout le code)?
Oui, c'est assez connu et cela décrit ci-dessus est un scénario courant. Supprimez le modèle d'observateur et créez-le simplement sous une forme set / get en bénéficierait tout autant. Selon ofc où vous l'implémentez, pas de règles d'or à la fin.
LiveData
est immuable, puisque le client ne peut pas changer l'état interne, donc thread-safe