safe_union در HIDL نشاندهنده نوع اتحادیه برچسبگذاریشده صریح است.
این شبیه union است، با این تفاوت که safe_union نوع زیرین را پیگیری میکند و با جاوا سازگار است. نوع
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; };