safe_union trong HIDL đại diện cho một loại hợp nhất được gắn thẻ rõ ràng.
Loại này tương tự như union, ngoại trừ việc safe_union theo dõi
loại cơ bản và tương thích với Java. Loại safe_union có trong Android 10 trở lên cho các thiết bị mới và thiết bị đã nâng cấp.
Cú pháp
Một safe_union được biểu thị trong HIDL giống hệt như
union hoặc struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Cách sử dụng
Trong thời gian chạy, safe_union chỉ là một loại. Theo mặc định, đây là loại đầu tiên trong hợp nhất. Ví dụ: ở trên, MySafeUnion theo mặc định là TypeA.
hidl-gen tạo một lớp hoặc cấu trúc tuỳ chỉnh cho safe_union trong cả C++ và Java. Lớp này bao gồm một bộ phân biệt cho từng thành viên (trong hidl_discriminator), một phương thức để lấy bộ phân biệt hiện tại (getDiscriminator) và các phương thức setter và getter cho từng thành viên. Mỗi phương thức setter và getter được đặt tên chính xác như thành viên của nó.
Ví dụ: phương thức getter cho TypeA a được gọi là "a" và nó
trả về một giá trị thuộc TypeA. Phương thức setter tương ứng cũng được gọi là "a" và lấy tham số thuộc TypeA. Việc đặt giá trị trong safe_union sẽ cập nhật giá trị của bộ phân biệt do getDiscriminator trả về. Việc truy cập một giá trị từ bộ phân biệt không phải là bộ phân biệt hiện tại sẽ huỷ chương trình. Ví dụ: nếu việc gọi getDiscriminator trên một thực thể của
MySafeUnion trả về hidl_discriminator::b, thì
việc cố gắng truy xuất a sẽ huỷ chương trình.
Monostate
A safe_union luôn có một giá trị, nhưng nếu bạn muốn không
có giá trị, hãy sử dụng android.hidl.safe_union@1.0::Monostate làm phần giữ chỗ. Ví dụ: hợp nhất sau đây có thể là noinit (trống) hoặc foo:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };