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