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