Kết hợp an toàn

safe_union trong HIDL biểu thị một kiểu liên kết được gắn thẻ rõ ràng. Thao tác này tương tự như union, ngoại trừ việc giữ lại safe_union theo dõi loại cơ bản và tương thích với Java. Chiến lược phát hành đĩa đơn Loại safe_union có trong Android 10 và cao hơ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ị dưới dạng 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, loại đầu tiên trong kết hợp. Ví dụ: ở trên, Theo mặc định, MySafeUnionTypeA.

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 từng thành viên (trong hidl_discriminator), một phương pháp để lấy giá trị phân biệt hiện tại (getDiscriminator), phương thức setter và phương thức getter cho từng thành phầ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ề giá trị TypeA. Phương thức setter tương ứng cũng là được gọi là "a" và lấy tham số TypeA. Đặt giá trị trong safe_union cập nhật giá trị của đối tượng phân biệt thành được trả về bởi getDiscriminator. Truy cập vào một giá trị từ đối tượng phân biệt không phải là đối tượng phân biệt hiện tại sẽ huỷ chương trình. Cho nếu gọi getDiscriminator trên một thực thể của MySafeUnion trả về hidl_discriminator::b, sau đó việc cố gắng truy xuất a sẽ huỷ chương trình.

Đơn trạng

safe_union luôn có giá trị, nhưng nếu muốn thì không có giá trị, hãy sử dụng android.hidl.safe_union@1.0::Monostate làm giá trị 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;
};