สหภาพปลอดภัย

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;
};