MutableLiveData는 LiveData에서 확장됩니다. LiveData의 보호 된 메서드는 자체 또는 하위 클래스에 의해서만 처리 될 수 있습니다. 따라서이 경우 LiveData의 하위 클래스 인 MutableLiveData는 이러한 보호 된 메서드에 액세스 할 수 있습니다.
여러분이하고 싶은 것은 인스턴스를 관찰하고 변경 사항이 있는지 확인하는 것입니다. 그러나 동시에 "외부인"이 관찰중인 인스턴스를 변경하는 것을 원하지 않습니다. 어떤 의미에서 이것은 변경 가능하고 새로운 상태를 업데이트하기 위해 변경 가능한 객체를 갖기를 원하므로 문제가 발생하여이 인스턴스를 업데이트해서는 안되는 사람이 없도록합니다. 이 두 기능은 서로 충돌하지만 추가 레이어를 생성하여 해결할 수 있습니다.
따라서 메서드에 액세스 할 수있는 클래스를 사용하여 클래스 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(...)
인용구 일반적으로 말해서, 그러한 상속 형태 (특정 메서드의 가시성을 높이는 것이 유일한 변경 사항 임)는 잘 알려진 관행이며 유용 할 수있는 몇 가지 시나리오는 무엇입니까 (모든 코드에 액세스 할 수 있다고 가정)?
예, 꽤 잘 알려져 있으며 위에서 설명한 것은 일반적인 시나리오입니다. 관찰자 패턴을 제거하고 설정 / 가져 오기 형식으로 만드는 것만으로도 많은 이점이 있습니다. 구현 위치에 따라 결국 황금률이 없습니다.
LiveData
클라이언트가 내부 상태를 변경할 수 있기 때문에 스레드 안전 불변