safe_union
di HIDL mewakili tipe serikat yang diberi tag secara eksplisit. Ini mirip dengan union
kecuali safe_union
melacak jenis yang mendasarinya dan kompatibel dengan Java. Jenis safe_union
tersedia di Android 10 dan lebih tinggi untuk perangkat baru dan yang ditingkatkan versinya.
Sintaksis
safe_union
diekspresikan dalam HIDL persis seperti union
atau struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Penggunaan
Saat runtime, safe_union
hanya satu jenis. Secara default, ini akan menjadi tipe pertama dalam serikat pekerja. Misalnya, di atas, MySafeUnion
secara default adalah TypeA
.
hidl-gen
menghasilkan kelas atau struct khusus untuk safe_union
di C++ dan Java. Kelas ini menyertakan diskriminator untuk setiap anggota (dalam hidl_discriminator
), metode untuk mendapatkan diskriminator saat ini ( getDiscriminator
), dan penyetel dan pengambil untuk setiap anggota. Setiap setter dan getter dinamai persis seperti anggotanya. Misalnya, pengambil untuk TypeA a
akan disebut "a", dan itu akan mengembalikan sesuatu dari TypeA
. Setter yang sesuai juga akan disebut "a" dan mengambil parameter TypeA
. Menyetel nilai dalam safe_union
akan memperbarui nilai diskriminator seperti yang dikembalikan oleh getDiscriminator
. Mengakses nilai dari pembeda yang bukan pembeda 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, tetapi jika diinginkan untuk tidak memiliki nilai, gunakan android.hidl.safe_union@1.0::Monostate
sebagai pengganti. Misalnya, gabungan berikut dapat berupa noinit
(kosong) atau foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };