اتحاد آمن

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