safe_union di HIDL merepresentasikan jenis gabungan yang diberi tag secara eksplisit.
Hal ini mirip dengan union, kecuali safe_union melacak
jenis pokok 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 default, ini adalah
jenis pertama dalam gabungan. Misalnya, di atas,
MySafeUnion secara default adalah TypeA.
hidl-gen membuat 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 getter tersebut
menampilkan sesuatu dari TypeA. Setter yang sesuai juga
akan dipanggil "a" dan menggunakan parameter TypeA. Menetapkan nilai di
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, maka mencoba mengambil a akan menghentikan program.
Monostate
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; };