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