איחוד בטוח

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 זהה בדיוק לשם של המשתנה. לדוגמה, הפונקציה לקבלת הערך של 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;
};