اتحاد آمن

تمثّل السمة 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. دالة setter المقابلة لها أيضًا يمكن تسميتها "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;
};