Penyatuan yang aman

safe_union dalam HIDL mewakili jenis union yang diberi tag secara eksplisit. Ini mirip dengan union, kecuali safe_union terus melacak jenis yang mendasarinya dan kompatibel dengan Java. Jenis safe_union tersedia di Android 10 dan yang lebih tinggi untuk perangkat baru dan yang diupgrade.

Sintaksis

safe_union dinyatakan dalam HIDL persis seperti union atau struct.

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

Penggunaan

Saat runtime, safe_union hanya memiliki satu jenis. Secara {i>default<i}, ini adalah jenis pertama dalam union. Misalnya, di atas, MySafeUnion secara default adalah TypeA.

hidl-gen menghasilkan class atau struct kustom untuk safe_union di C++ dan Java. Class ini mencakup diskriminator untuk setiap anggota (di hidl_discriminator), metode untuk mendapatkan diskriminator saat ini (getDiscriminator), serta penyetel dan pengambil untuk setiap anggota. Setiap penyetel dan pengambil diberi nama persis seperti anggotanya. Misalnya, pengambil untuk TypeA a disebut "a", dan menampilkan sesuatu dari TypeA. Penyetel yang sesuai juga disebut "a" dan menggunakan parameter TypeA. Menetapkan nilai dalam safe_union akan memperbarui nilai diskriminator seperti yang ditampilkan oleh getDiscriminator. Mengakses nilai dari diskriminator yang bukan diskriminator saat ini akan membatalkan program. Misalnya, jika memanggil getDiscriminator pada instance MySafeUnion akan menampilkan hidl_discriminator::b, maka mencoba mengambil a akan membatalkan program.

Monostate

safe_union selalu memiliki nilai, tetapi jika tidak ingin memiliki nilai, gunakan android.hidl.safe_union@1.0::Monostate sebagai placeholder. Misalnya, gabungan berikut dapat berupa noinit (kosong) atau foo:

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};