تمثّل السمة 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
. دالة setter المقابلة لها أيضًا
يمكن تسميتها "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; };