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