يمثّل 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
)، وعناصر ضبط
وعناصر جلب لكل عضو. يتم تسمية كل أداة ضبط وأداة جلب تمامًا مثل العنصر التابع لها.
على سبيل المثال، يُطلق على دالة الحصول على القيمة الخاصة بـ 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; };