اتحاد آمن

يمثّل safe_union في HIDL نوع اتحاد مصنّفًا بشكل صريح. يشبه هذا النوع union، إلا أنّ safe_union يتتبّع النوع الأساسي ويتوافق مع Java. يتوفّر نوع safe_union في Android 10 والإصدارات الأحدث للأجهزة الجديدة والمطوّرة.

البنية

يتم التعبير عن 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;
};