safe_union در HIDL نشاندهنده یک نوع union با برچسبگذاری صریح است. این شبیه به union است، با این تفاوت که safe_union نوع اصلی را پیگیری میکند و با جاوا سازگار است. نوع safe_union در اندروید ۱۰ و بالاتر برای دستگاههای جدید و ارتقا یافته در دسترس است.
نحو
یک safe_union دقیقاً مانند یک union یا struct در HIDL بیان میشود.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};کاربرد
در زمان اجرا، یک safe_union فقط یک نوع دارد. به طور پیشفرض، اولین نوع در union است. برای مثال، در بالا، MySafeUnion به طور پیشفرض TypeA است.
hidl-gen یک کلاس یا ساختار سفارشی برای یک safe_union در هر دو زبان C++ و جاوا تولید میکند. این کلاس شامل یک متمایزکننده برای هر عضو (در 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 به عنوان یک placeholder استفاده کنید. برای مثال، union زیر میتواند noinit (خالی) یا foo باشد:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };