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
สร้างคลาสหรือโครงสร้างที่กำหนดเองสำหรับ safe_union
ทั้งใน C ++ และ Java คลาสนี้ประกอบด้วย discriminator สำหรับสมาชิกแต่ละคน (ใน hidl_discriminator
) วิธีการรับ discriminator ปัจจุบัน ( getDiscriminator
) และผู้ตั้งค่าและ getters สำหรับสมาชิกแต่ละคน setter และ getter แต่ละตัวมีชื่อเป็นสมาชิกทุกประการ ตัวอย่างเช่น getter สำหรับ TypeA a
จะถูกเรียกว่า "a" และจะส่งคืนบางอย่างที่เป็น TypeA
ตัวตั้งค่าที่เกี่ยวข้องจะถูกเรียกว่า "a" และรับพารามิเตอร์ของ TypeA
การตั้งค่าใน safe_union
จะอัปเดตค่าของ discriminator ตามที่ส่งคืนโดย getDiscriminator
การเข้าถึงค่าจาก discriminator ที่ไม่ใช่ discriminator ปัจจุบันจะยกเลิกโปรแกรม ตัวอย่างเช่น หากการเรียก 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; };