يمثّل الرمز 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; };