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