safe_union
trong HIDL biểu thị một kiểu 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 cho các thiết bị mới và được 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ụ: ở trên,
Theo mặc định, MySafeUnion
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 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 như thành viên của phương thức đó.
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
. Đặ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
. 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 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; };