safe_union di HIDL mewakili jenis gabungan yang diberi tag secara eksplisit.
Hal ini mirip dengan union, kecuali safe_union 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
A safe_union diekspresikan dalam HIDL persis seperti a
union atau struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Penggunaan
Saat runtime, safe_union hanya memiliki satu jenis. Secara default, jenis ini adalah jenis pertama dalam gabungan. 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 setter dan getter untuk setiap anggota. Setiap setter dan getter diberi nama persis seperti anggotanya.
Misalnya, getter untuk TypeA a disebut "a", dan itu
menampilkan sesuatu dari TypeA. Setter yang sesuai juga akan 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 menghentikan program. Misalnya, jika memanggil getDiscriminator pada instance MySafeUnion menampilkan hidl_discriminator::b, mencoba mengambil a akan menghentikan program.
Monostate
A safe_union selalu memiliki nilai, tetapi jika Anda 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; };