safe_union
dalam HIDL mewakili jenis union yang diberi tag secara eksplisit.
Ini mirip dengan union
kecuali safe_union
menyimpan
jenis yang mendasarinya dan kompatibel dengan Java. Tujuan
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
Pada runtime, safe_union
hanya merupakan satu jenis. Secara {i>default<i},
tipe pertama dalam union. Misalnya di atas,
MySafeUnion
adalah TypeA
secara default.
hidl-gen
membuat class atau struct kustom untuk
safe_union
di C++ dan Java. Kelas ini menyertakan
diskriminator untuk setiap anggota (di hidl_discriminator
), metode untuk
mendapatkan diskriminator (getDiscriminator
) saat ini, dan penyetel, serta
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 terkait juga
disebut "a" dan mengambil parameter TypeA
. Menetapkan nilai di
safe_union
memperbarui nilai diskriminator sebagai
yang ditampilkan oleh getDiscriminator
. Mengakses nilai dari
diskriminator yang bukan diskriminator
saat ini membatalkan program. Sebagai
Jika memanggil getDiscriminator
pada instance
MySafeUnion
menampilkan hidl_discriminator::b
, lalu
mencoba mengambil a
akan membatalkan program.
Monostate
safe_union
selalu memiliki nilai, tetapi jika diinginkan untuk tidak memiliki nilai
memiliki nilai, gunakan android.hidl.safe_union@1.0::Monostate
sebagai
{i>placeholder<i}. Misalnya, union berikut dapat berupa
noinit
(kosong) atau foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };