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