اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
اتحاد آمن
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يمثّل الرمز safe_union
في HIDL نوع اتحاد تم وضع علامة عليه صراحةً.
يشبه هذا العنصر union
، إلا أنّ safe_union
يحتفظ
بسجلّ للنوع الأساسي وهو متوافق مع Java. يتوفّر النوع
safe_union
في الإصدار 10 من Android
والإصدارات الأحدث على الأجهزة الجديدة والأجهزة التي تمت ترقيتها.
بناء الجملة
يتم التعبير عن 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
)، وطرق ضبط و retrieving لكل عضو. يتم تسمية كلّ من العنصرَين 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
كعنصر
نائب. على سبيل المثال، يمكن أن يكون الاندماج التالي إما
noinit
(فارغ) أو foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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```"]]