איחוד בטוח

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 זהה לשם של המאפיין שלו. לדוגמה, הפונקציה getter של TypeA a נקראת 'a', מחזירה ערך של TypeA. גם ה-setter התואם נקרא '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;
};