safe_union
ใน HIDL แสดงถึงประเภทสหภาพที่ติดแท็กอย่างชัดเจน
ซึ่งคล้ายกับ union
ยกเว้นว่า safe_union
จะติดตามประเภทพื้นฐานและใช้ได้กับ Java safe_union
ประเภทพร้อมใช้งานใน Android 10
ขึ้นไปสำหรับอุปกรณ์ใหม่และอุปกรณ์ที่อัปเกรด
วากยสัมพันธ์
safe_union
จะแสดงใน HIDL เหมือนกับ union
หรือ struct
ทุกประการ
safe_union MySafeUnion { TypeA a; TypeB b; ... };
การใช้งาน
ในขณะรันไทม์ safe_union
จะมีเพียงประเภทเดียวเสมอ โดยค่าเริ่มต้นจะเป็น
ประเภทแรกในสหภาพ เช่น ด้านบน MySafeUnion
จะเป็น TypeA
โดยค่าเริ่มต้น
hidl-gen
จะสร้างคลาสหรือโครงสร้างที่กำหนดเองสำหรับ a
safe_union
ทั้งใน C++ และ Java คลาสนี้มีตัวแบ่งสำหรับสมาชิกแต่ละคน (ใน hidl_discriminator
) วิธี
รับตัวแบ่งปัจจุบัน (getDiscriminator
) รวมถึงตัวตั้งค่าและ
ตัวรับค่าสำหรับสมาชิกแต่ละคน โดยตัวตั้งค่าและตัวรับค่าแต่ละรายการจะมีชื่อตรงกับสมาชิกของตัวเอง
เช่น Getter สำหรับ TypeA a
จะเรียกว่า "a" และจะ
แสดงผลบางอย่างของ TypeA
ส่วน Setter ที่เกี่ยวข้องจะเรียกอีกอย่างว่า "a" และใช้พารามิเตอร์ของ TypeA
การตั้งค่าใน
safe_union
จะอัปเดตค่าของตัวแยกประเภทตามที่ getDiscriminator
แสดง การเข้าถึงค่าจาก
ตัวแยกประเภทที่ไม่ใช่ตัวแยกประเภทปัจจุบันจะทำให้โปรแกรมหยุดทำงาน เช่น หากการเรียก getDiscriminator
ในอินสแตนซ์ของ MySafeUnion
แสดงผลเป็น hidl_discriminator::b
การพยายามเรียก a
จะทำให้โปรแกรมหยุดทำงาน
Monostate
safe_union
จะมีค่าเสมอ แต่หากไม่ต้องการให้มีค่า ให้ใช้ android.hidl.safe_union@1.0::Monostate
เป็นตัวยึดตำแหน่ง ตัวอย่างเช่น สหภาพต่อไปนี้อาจเป็น
noinit
(ว่างเปล่า) หรือ foo
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };