safe_union
di HIDL mewakili tipe gabungan yang diberi tag secara eksplisit. Ini mirip dengan union
kecuali safe_union
melacak tipe dasarnya dan kompatibel dengan Java. Jenis safe_union
tersedia di Android 10 dan 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 akan menjadi tipe pertama dalam gabungan. Misalnya, di atas, MySafeUnion
secara default adalah TypeA
.
hidl-gen
menghasilkan kelas atau struct khusus untuk safe_union
di C++ dan Java. Kelas ini mencakup diskriminator untuk setiap anggota (dalam hidl_discriminator
), metode untuk mendapatkan diskriminator saat ini ( getDiscriminator
), dan setter dan getter untuk setiap anggota. Setiap setter dan getter diberi nama persis seperti anggotanya. Misalnya, pengambil untuk TypeA a
akan dipanggil "a", dan ia akan mengembalikan sesuatu dari TypeA
. Penyetel yang sesuai juga akan dipanggil "a" dan mengambil parameter TypeA
. Menetapkan nilai dalam safe_union
akan memperbarui nilai diskriminator seperti yang dikembalikan oleh getDiscriminator
. Mengakses nilai dari diskriminator yang bukan diskriminator saat ini akan membatalkan program. Misalnya, jika memanggil getDiscriminator
pada instance MySafeUnion
mengembalikan hidl_discriminator::b
, maka mencoba mengambil a
akan membatalkan program.
Monostat
safe_union
selalu memiliki nilai, namun jika diinginkan tidak 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; };