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

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 จะมีเพียง 1 ประเภทเท่านั้นที่รันไทม์ โดยค่าเริ่มต้น จะเป็นประเภทแรกในยูเนียน ตัวอย่างเช่น ด้านบน MySafeUnion คือ TypeA โดยค่าเริ่มต้น

hidl-gen สร้างคลาสหรือโครงสร้างที่กำหนดเองสำหรับ safe_union ทั้งใน C++ และ Java คลาสนี้มีตัวแบ่งสำหรับสมาชิกแต่ละคน (ใน hidl_discriminator) วิธีการรับตัวแบ่งปัจจุบัน (getDiscriminator) รวมถึงตัวตั้งค่าและตัวรับสำหรับสมาชิกแต่ละคน โดยตั้งชื่อเมธอด setter และ getter แต่ละรายการให้ตรงกับชื่อของสมาชิก เช่น Getter สําหรับ TypeA a จะเรียกว่า "a" และแสดงผล TypeA ตัวตั้งค่าที่เกี่ยวข้องจะเป็น เรียกว่า "a" และรับพารามิเตอร์ TypeA กำหนดค่าใน safe_union จะอัปเดตค่าของดิสคริมิเตอร์เป็น getDiscriminator ส่งคืน การเข้าถึงค่าจากตัวระบุที่ไม่ใช่ตัวระบุปัจจุบันจะยกเลิกโปรแกรม สำหรับ ถ้าเรียกใช้ getDiscriminator ในอินสแตนซ์ MySafeUnion แสดงผล hidl_discriminator::b จากนั้นจ่าย การพยายามเรียกข้อมูล a ล้มเลิกโปรแกรม

สถานะเดียว

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