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