اتحاد آمن

يمثّل الرمز 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 لكل عضو. يتم تسمية كلّ من طريقة الضبط وطريقة الحصول على القيمة على النحو نفسه تمامًا لعضوها. على سبيل المثال، يُطلق على دالة الحصول على TypeA a اسم "a"، وهي تُرجِع قيمة TypeA. يُسمّى أيضًا الدالة المخصّصة لضبط القيمة باسم "a" وتستخدِم مَعلمة TypeA. ويؤدي ضبط القيمة في safe_union إلى تعديل قيمة المُميِّز على النحو الذي يعرضه getDiscriminator. يؤدي الوصول إلى قيمة من محدد ينتمي إلى فئة ليست فئة المحدد الحالية إلى إيقاف البرنامج. على سبيل المثال، إذا أدّى استدعاء getDiscriminator في مثيل MySafeUnion إلى عرض hidl_discriminator::b، يؤدي محاولة استرجاع a إلى إيقاف البرنامج.

ولاية أحادية

تكون للسمة 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;
};