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

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