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