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