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 คลาสนี้มีตัวแยกแยะสำหรับสมาชิกแต่ละคน (ใน 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; };