Kết hợp an toàn

safe_union trong HIDL đại diện cho một loại liên kết được gắn thẻ rõ ràng. Phương thức này tương tự như union, ngoại trừ 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 đối với các thiết bị mới và thiết bị đã nâng cấp.

Cú pháp

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ỉ có một loại. Theo mặc định, đây là loại đầu tiên trong liên kết. Ví dụ như ở trên, MySafeUnionTypeA theo mặc định.

hidl-gen tạo một lớp hoặc cấu trúc tuỳ chỉnh cho một safe_union trong cả C++ và Java. Lớp này bao gồm một giá trị phân biệt cho mỗi thành viên (trong hidl_discriminator), một phương thức để lấy giá trị phân biệt hiện tại (getDiscriminator) cũng như các phương thức setter và getter cho mỗi thành viên. Mỗi phương thức setter và getter được đặt tên chính xác là thành phần của nó. Ví dụ: phương thức getter cho TypeA a được gọi là "a" và phương thức này sẽ trả về một giá trị của TypeA. Phương thức setter tương ứng cũng được gọi là "a" và lấy tham số là TypeA. Việc đặt giá trị trong safe_union sẽ cập nhật giá trị của giá trị phân biệt do getDiscriminator trả về. Việc truy cập vào một giá trị từ giá trị phân biệt không phải là giá trị phân biệt hiện tại sẽ huỷ bỏ chương trình. Ví dụ: nếu lệnh 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ỷ bỏ chương trình.

Trạng thái đơn

safe_union luôn có giá trị, nhưng nếu bạn không muốn có giá trị, hãy dùng android.hidl.safe_union@1.0::Monostate làm phần giữ chỗ. Ví dụ: tổ hợp 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;
};