يمثّل الرمز 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; };