איחוד בטוח

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