الاتحاد الآمن

يمثل 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 ستؤدي إلى إحباط البرنامج.

أحادي الحالة

تحتوي 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;
};