MutableLiveData diturunkan dari LiveData. Metode yang dilindungi LiveData hanya dapat ditangani oleh diri sendiri atau subkelas. Jadi dalam hal ini MutableLiveData sebagai sub kelas LiveData dapat mengakses metode yang dilindungi ini.
Apa yang ingin Anda lakukan adalah mengamati pada sebuah contoh dan melihat apakah ada perubahan. Tetapi pada saat yang sama Anda tidak ingin ada "orang luar" yang mengubah contoh yang Anda amati. Dalam arti tertentu ini menciptakan masalah, karena Anda ingin memiliki objek yang dan dapat diubah, untuk memperbarui status baru, dan tidak dapat diubah, untuk memastikan tidak ada orang yang tidak dapat memperbarui contoh ini. Kedua fitur ini saling bertentangan tetapi dapat diselesaikan dengan membuat lapisan tambahan.
Jadi yang Anda lakukan adalah memperluas kelas Anda, LiveData, dengan kelas yang dapat mengakses metodenya. Sub lapisan, dalam hal ini MutableLiveData, dapat mengakses metode yang dilindungi dari induknya (/ super).
Sekarang Anda mulai membuat instance, dan membuat instance pengamat Anda dari MutableLiveData. Pada saat yang sama Anda membuat instance LiveData yang merujuk ke instance yang sama ini. Karena MutableLiveData memperluas LiveData, setiap instance MutableLiveData adalah objek LiveData dan oleh karena itu dapat direferensikan oleh variabel LiveData.
Sekarang triknya hampir selesai. Anda hanya mengekspos instance LiveData, tidak ada yang dapat menggunakan metode terlindungnya, juga tidak dapat mentransmisikannya ke supernya (mungkin pada waktu kompilasi, tetapi tidak akan berjalan: RunTime error). Dan Anda membuat instance subkelas yang sebenarnya tetap pribadi, jadi itu hanya dapat diubah oleh mereka yang memiliki instance, menggunakan metode 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(.....)
Sekarang kelas super memberi tahu jika ada perubahan yang diterapkan.
_name.postValue(...)
Blockquote Secara umum, apakah bentuk pewarisan semacam itu (meningkatkan visibilitas metode tertentu menjadi satu-satunya perubahan) merupakan praktik yang terkenal dan skenario apa yang mungkin berguna (dengan asumsi kita memiliki akses ke semua kode)?
Ya, ini cukup terkenal dan ini dijelaskan di atas adalah skenario umum. Hapus pola pengamat, dan buat dalam bentuk set / get akan mendapatkan banyak keuntungan darinya. Tergantung dari mana Anda menerapkannya, tidak ada aturan emas pada akhirnya.
LiveData
tidak dapat diubah, karena klien tidak dapat mengubah status internal, oleh karena itu aman utas