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
), שיטה
מקבלים את המבדילה הנוכחית (getDiscriminator
), ואת הקובעים
לכל חבר מועדון. השם של כל מי שמרכיב את הפרמטר וכל אחד מהם מוגדר בדיוק בתור האיבר שלו.
לדוגמה, הפונקציה 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
placeholder. לדוגמה, האיחוד הבא יכול להיות
noinit
(ריק) או foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };