اتحادیه ایمن

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 ، مقدار discriminator را همانطور که توسط 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;
};