MutableLiveDataはLiveDataから拡張されています。LiveDataの保護されたメソッドは、selfまたはサブクラスによってのみアドレス指定できます。したがって、この場合、LiveDataのサブクラスであるMutableLiveDataは、これらの保護されたメソッドにアクセスできます。
あなたがしたいことは、インスタンスを観察し、変更があるかどうかを確認することです。しかし同時に、あなたは「部外者」があなたが観察しているそのインスタンスを変更することを望まない。ある意味で、これは問題を引き起こします。変更可能なオブジェクトが必要なため、変更できない新しいステータスを更新して、このインスタンスを更新できない人がいないことを確認します。これらの2つの機能は互いに競合しますが、追加のレイヤーを作成することで解決できます。
つまり、メソッドにアクセスできるクラスを使用して、クラスLiveDataを拡張する必要があります。サブレイヤー(この場合はMutableLiveData)は、その親(/ super)の保護されたメソッドにアクセスできます。
次に、インスタンスの作成を開始し、MutableLiveDataのオブザーバーインスタンスを作成します。同時に、この同じインスタンスを参照するLiveDataインスタンスを作成します。MutableLiveDataはLiveDataを拡張するため、MutableLiveDataインスタンスはすべてLiveDataオブジェクトであり、LiveData変数から参照できます。
これで、トリックはほぼ完了しました。LiveDataインスタンスのみを公開し、保護されたメソッドを使用することも、スーパーにキャストすることもできません(コンパイル時に実行される可能性がありますが、実行されません:ランタイムエラー)。また、実際のサブクラスインスタンスをプライベートに保つため、インスタンスのメソッドを使用して、インスタンスを所有している人だけが変更できます。
//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
クライアントは内部状態を変更できないため、は不変です。したがって、スレッドセーフです