MutableLiveData, LiveData'dan genişliyor. LiveData'nın korumalı yöntemleri yalnızca kendi kendine veya alt sınıflar tarafından ele alınabilir. Dolayısıyla, bu durumda MutableLiveData, LiveData'nın bir alt sınıfı olan bu korumalı yöntemlere erişebilir.
Yapmak istediğiniz şey, bir vakayı gözlemlemek ve herhangi bir değişiklik olup olmadığını görmek. Ama aynı zamanda, gözlemlemekte olduğunuz o örneği herhangi bir "yabancının" değiştirmesini istemezsiniz. Bir anlamda bu, bir nesneye sahip olmak, herhangi bir yeni durumu güncellemek ve değiştirilemez bir nesneye sahip olmak istediğinizden, bu örneği güncelleyemeyeceğinden emin olmak için bir sorun yaratır. Bu iki özellik birbiriyle çakışır ancak fazladan bir katman oluşturularak çözülebilir.
Yani yaptığınız şey, sınıfınızı, LiveData'yı, yöntemlerine erişebilen bir sınıfla genişletmektir. Alt katman, bu durumda MutableLiveData, ebeveyninin (/ super) korumalı yöntemlerine erişebilir.
Şimdi örnekler oluşturmaya başlarsınız ve MutableLiveData'nın gözlemci örneğini oluşturursunuz. Aynı zamanda aynı örneğe başvuran bir LiveData örneği oluşturursunuz. MutableLiveData, LiveData'yı genişlettiği için, herhangi bir MutableLiveData örneği bir LiveData nesnesidir ve bu nedenle bir LiveData değişkeni tarafından referans alınabilir.
Şimdi hile neredeyse bitti. Yalnızca LiveData örneğini açığa çıkarırsınız, hiç kimse korumalı yöntemlerini kullanamaz veya onu super değerine dönüştüremez (belki derleme zamanında, ancak çalışmaz: RunTime hatası). Ve gerçek alt sınıf örneğini özel tutarsınız, böylece yalnızca örneğin sahibi olanlar, örneğin yöntemlerini kullanarak değiştirilebilir.
//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(.....)
Artık süper sınıf, herhangi bir değişiklik yapıldığında bildirimde bulunur.
_name.postValue(...)
Blok alıntı Genel olarak konuşursak, böyle bir kalıtım biçimi (tek değişiklik olarak belirli yöntemlerin görünürlüğünü arttırmak) iyi bilinen bir uygulama mıdır ve yararlı olabileceği bazı senaryolar nelerdir (tüm koda erişimimiz olduğunu varsayarsak)?
Evet, oldukça iyi bilinmektedir ve yukarıda açıklanan bu yaygın bir senaryodur. Gözlemci desenini kaldırın ve onu bir set / get formunda yapın, ondan en az o kadar fayda sağlayacaktır. Nerede uyguladığınıza bağlı olarak, sonunda altın kural yok.
LiveData
değiştirilemez, çünkü müşteri dahili durumu değiştiremez, bu nedenle iş parçacığı için güvenlidir