safe_union
ב-HIDL מייצג סוג איחוד מתויג במפורש. זה דומה union
חוץ מזה safe_union
עוקב אחר הסוג הבסיסי ותואם ל-Java. סוג safe_union
זמין באנדרואיד 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
), ו-seters ו-getters עבור כל איבר. כל מגדיר וגטר נקרא בדיוק כחבר שלו. לדוגמה, המשבר עבור 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; };