Safe Union

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) ซึ่งเป็นวิธีในการ ดู Disriminator ในปัจจุบัน (getDiscriminator) ตัวตั้งค่าและ Getter สำหรับสมาชิกแต่ละคน ชื่อ Setter และ Getter แต่ละรายการจะชื่อเป็นสมาชิกจริงๆ ตัวอย่างเช่น Getter ของ TypeA a เรียกว่า "a" และ แสดงผลเป็น TypeA ตัวตั้งค่าที่เกี่ยวข้องจะเป็น เรียกว่า "a" และรับพารามิเตอร์ TypeA กำหนดค่าใน safe_union จะอัปเดตค่าของดิสคริมิเตอร์เป็น getDiscriminator ส่งคืน การเข้าถึงค่าจาก Disriminator ที่ไม่ใช่ Disriminator ในปัจจุบันล้มเลิกโปรแกรมไป สำหรับ ถ้าเรียกใช้ 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;
};