Gabungan aman

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