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