איחוד בטוח

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) ושיטות setter ו-getter לכל חבר. השם של כל setter ו-getter זהה בדיוק לשם של החבר שלו. לדוגמה, ה-getter של TypeA a נקרא 'a', והוא מחזיר משהו מ-TypeA. הפונקציה המתאימה להגדרת הערך נקראת גם 'a' והיא מקבלת פרמטר מסוג TypeA. הגדרת הערך ב-safe_union מעדכנת את הערך של המפלה שמוחזר על ידי getDiscriminator. אם מנסים לגשת לערך ממפלה שאינו המפלה הנוכחית, התוכנית מופסקת. לדוגמה, אם קריאה של getDiscriminator במופע של MySafeUnion מחזירה hidl_discriminator::b, ניסיון לאחזר את a יגרום לביטול התוכנית.

Monostate

למאפיין 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;
};