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; };