איחוד בטוח

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