MutableLiveData ขยายจาก LiveData วิธีการป้องกันของ LiveData สามารถแก้ไขได้ด้วยตนเองหรือคลาสย่อยเท่านั้น ดังนั้นในกรณีนี้ MutableLiveData ซึ่งเป็นคลาสย่อยของ LiveData สามารถเข้าถึงวิธีการป้องกันเหล่านี้ได้
สิ่งที่คุณต้องการทำคือสังเกตจากอินสแตนซ์และดูว่ามีการเปลี่ยนแปลงหรือไม่ แต่ในขณะเดียวกันคุณก็ไม่ต้องการให้ "บุคคลภายนอก" ใด ๆ มาเปลี่ยนแปลงอินสแตนซ์นั้น ในแง่หนึ่งสิ่งนี้ทำให้เกิดปัญหาเนื่องจากคุณต้องการให้วัตถุที่เป็นและเปลี่ยนแปลงได้เพื่ออัปเดตสถานะใหม่และไม่สามารถเปลี่ยนแปลงได้เพื่อให้แน่ใจว่าไม่มีใครที่ไม่ควรอัปเดตอินสแตนซ์นี้ คุณลักษณะทั้งสองนี้ขัดแย้งกัน แต่สามารถแก้ไขได้โดยการสร้างเลเยอร์พิเศษ
ดังนั้นสิ่งที่คุณทำคือขยายคลาส LiveData ของคุณด้วยคลาสที่สามารถเข้าถึงเมธอดได้ เลเยอร์ย่อยในกรณีนี้คือ MutableLiveData สามารถเข้าถึงวิธีการป้องกันของพาเรนต์ (/ super) ได้
ตอนนี้คุณเริ่มสร้างอินสแตนซ์และสร้างอินสแตนซ์ผู้สังเกตการณ์ของ MutableLiveData ในเวลาเดียวกันคุณสร้างอินสแตนซ์ LiveData โดยอ้างถึงอินสแตนซ์เดียวกันนี้ เนื่องจาก MutableLiveData ขยาย LiveData อินสแตนซ์ MutableLiveData ใด ๆ จึงเป็นออบเจ็กต์ LiveData ดังนั้นจึงสามารถอ้างอิงได้โดยตัวแปร LiveData
ตอนนี้เคล็ดลับเกือบเสร็จแล้ว คุณแสดงเฉพาะอินสแตนซ์ LiveData เท่านั้นไม่มีใครสามารถใช้วิธีการป้องกันและไม่สามารถส่งไปยังขั้นสูงได้ (อาจจะในเวลาคอมไพล์ แต่จะไม่ทำงาน: ข้อผิดพลาด RunTime) และคุณเก็บอินสแตนซ์คลาสย่อยจริงไว้เป็นส่วนตัวดังนั้นจึงสามารถเปลี่ยนแปลงได้โดยผู้ที่เป็นเจ้าของอินสแตนซ์เท่านั้นโดยใช้วิธีการของอินสแตนซ์
//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(...)
Blockquote โดยทั่วไปแล้วรูปแบบของการสืบทอด (การเพิ่มการมองเห็นของวิธีการบางอย่างเป็นการเปลี่ยนแปลงเพียงอย่างเดียว) การปฏิบัติที่เป็นที่รู้จักกันดีและมีสถานการณ์ใดบ้างที่อาจเป็นประโยชน์ (สมมติว่าเราสามารถเข้าถึงรหัสทั้งหมดได้)
ใช่มันค่อนข้างเป็นที่รู้จักกันดีและสิ่งที่อธิบายไว้ข้างต้นเป็นสถานการณ์ทั่วไป ลบรูปแบบผู้สังเกตการณ์และทำให้เป็น set / get form ก็จะได้รับประโยชน์มากพอ ๆ กับมัน ขึ้นอยู่กับว่าคุณนำไปใช้ที่ใดไม่มีกฎทองในตอนท้าย
LiveData
ไม่เปลี่ยนรูปเนื่องจากไคลเอนต์ไม่สามารถเปลี่ยนสถานะภายในได้ดังนั้นเธรดปลอดภัย