safe_union
ב-HIDL מייצג סוג איחוד מתויג באופן מפורש.
הפעולה הזו דומה ל-union
, חוץ מ-safe_union
, עוקב אחרי הסוג הבסיסי ותואם ל-Java. הסוג safe_union
זמין ב-Android מגרסה 10 ואילך למכשירים חדשים ומשודרגים.
תחביר
A 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
) ו-setters ו-getters לכל חבר. השם של כל 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; };