اتحاد آمن

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