Penyatuan yang aman

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