تمثّل السمة 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; };