איחוד בטוח

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