اتحاد آمن

تمثّل السمة 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;
};