Persatuan Aman

safe_union di HIDL mewakili tipe gabungan yang diberi tag secara eksplisit. Ini mirip dengan union kecuali safe_union melacak tipe dasarnya dan kompatibel dengan Java. 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

Saat runtime, safe_union hanya memiliki satu jenis. Secara default, ini akan menjadi tipe pertama dalam gabungan. Misalnya, di atas, MySafeUnion secara default adalah TypeA .

hidl-gen menghasilkan kelas atau struct khusus untuk safe_union di C++ dan Java. Kelas ini mencakup diskriminator untuk setiap anggota (dalam hidl_discriminator ), metode untuk mendapatkan diskriminator saat ini ( getDiscriminator ), dan setter dan getter untuk setiap anggota. Setiap setter dan getter diberi nama persis seperti anggotanya. Misalnya, pengambil untuk TypeA a akan dipanggil "a", dan ia akan mengembalikan sesuatu dari TypeA . Penyetel yang sesuai juga akan dipanggil "a" dan mengambil parameter TypeA . Menetapkan nilai dalam safe_union akan memperbarui nilai diskriminator seperti yang dikembalikan oleh getDiscriminator . Mengakses nilai dari diskriminator yang bukan diskriminator 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, namun jika diinginkan tidak 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;
};