Liên kết an toàn

safe_union trong HIDL biểu thị một loại hợp nhất được gắn thẻ rõ ràng. Điều 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 cho các thiết bị mới và thiết bị được nâng cấp.

Cú pháp

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

Monostate

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