Serikat yang Aman

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