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

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