החל מ-27 במרץ 2025, מומלץ להשתמש ב-android-latest-release
במקום ב-aosp-main
כדי ליצור תרומות ל-AOSP. מידע נוסף זמין במאמר שינויים ב-AOSP.
איחוד בטוח
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
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;
};
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-07-27 (שעון UTC)."],[],[],null,["# Safe union\n\n`safe_union` in HIDL represents an explicitly tagged union type.\nThis is similar to a `union` except `safe_union` keeps\ntrack of the underlying type and is compatible with Java. The\n`safe_union` type is available in Android 10\nand higher for new and upgraded devices.\n\nSyntax\n------\n\nA `safe_union` is expressed in HIDL exactly like a\n`union` or `struct`. \n\n```scdoc\nsafe_union MySafeUnion {\n TypeA a;\n TypeB b;\n ...\n};\n```\n\nUsage\n-----\n\nAt runtime, a `safe_union` is only ever one type. By default, it's\nthe first type in the union. For instance, above,\n`MySafeUnion` is by default `TypeA`.\n\n`hidl-gen` generates a custom class or struct for a\n`safe_union` in both C++ and Java. This class includes a\ndiscriminator for each member (in `hidl_discriminator`), a method to\nget the current discriminator (`getDiscriminator`), and setters and\ngetters for each member. Each setter and getter is named exactly as its member.\nFor instance, the getter for `TypeA a` is called \"a\", and it\nreturns something of `TypeA`. The corresponding setter is also\nbe called \"a\" and takes a parameter of `TypeA`. Setting the value in\na `safe_union` updates the value of the discriminator as\nreturned by `getDiscriminator`. Accessing a value from a\ndiscriminator that isn't the current discriminator aborts the program. For\ninstance, if calling `getDiscriminator` on an instance of\n`MySafeUnion` returns `hidl_discriminator::b`, then\ntrying to retrieve `a` aborts the program.\n\nMonostate\n---------\n\nA `safe_union` always has a value, but if it is desired to not\nhave a value, use `android.hidl.safe_union@1.0::Monostate` as a\nplaceholder. For instance, the following union can either be\n`noinit` (empty) or `foo`: \n\n```python\nimport android.hidl.safe_union@1.0::Monostate;\n\nsafe_union OptionalFoo {\n Monostate noinit;\n Foo foo;\n};\n```"]]