Liên minh an toàn

safe_union trong HIDL đại diện cho loại kết hợp được gắn thẻ rõ ràng. Điều này tương tự như một 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ó sẵn trong Android 10 trở lên cho các thiết bị mới và đã nâng cấp.

Cú pháp

Một safe_union được thể hiện bằng HIDL chính xác giống như một 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, nó sẽ là loại đầu tiên trong liên minh. 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 tùy chỉnh cho safe_union trong cả C++ và Java. Lớp này bao gồm một bộ phân biệt đối xử cho mỗi thành viên (trong hidl_discriminator ), một phương thức để lấy bộ phân biệt đối xử hiện tại ( getDiscriminator ) cũng như các setters và getters cho mỗi thành viên. Mỗi setter và getter được đặt tên chính xác như thành viên của nó. Ví dụ: getter cho TypeA a sẽ được gọi là "a" và nó sẽ trả về một cái gì đó thuộc TypeA . Bộ setter tương ứng cũng sẽ được gọi là "a" và lấy tham số TypeA . Đặt giá trị trong safe_union sẽ cập nhật giá trị của bộ phân biệt đối xử được trả về bởi getDiscriminator . Việc truy cập một giá trị từ bộ phân biệt đối xử không phải là bộ phân biệt đối xử hiện tại sẽ hủy bỏ chương trình. Ví dụ: nếu gọi getDiscriminator trên một phiên bản MySafeUnion trả về hidl_discriminator::b thì việc cố gắng truy xuất a sẽ hủy bỏ chương trình.

đơn trạng

safe_union luôn có một giá trị, nhưng nếu muốn không có giá trị, hãy sử dụng android.hidl.safe_union@1.0::Monostate làm trình giữ chỗ. Chẳng hạn, liên kết sau có thể là noinit (trống) hoặc foo :

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};