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, MySafeUnion
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 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 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; };