safe_union w HIDL oznacza typ unii z jawnie oznaczonymi tagami.
Jest to podobne do union, z tym że safe_union śledzi typ bazowy i jest zgodny z językiem Java. Typ
safe_union jest dostępny na urządzeniach z Androidem 10 i nowszym.
Składnia
W HIDL element safe_union jest wyrażany dokładnie tak samo jak element union lub struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Wykorzystanie
W czasie działania safe_union ma zawsze tylko 1 typ. Domyślnie jest to pierwszy typ w unii. Na przykład powyżej MySafeUnion ma domyślnie wartość TypeA.
hidl-gen generuje niestandardową klasę lub strukturę dla safe_union w językach C++ i Java. Ta klasa zawiera wyróżnik dla każdego elementu (w hidl_discriminator), metodę pobierania bieżącego wyróżnika (getDiscriminator) oraz funkcje ustawiające i pobierające dla każdego elementu. Każda funkcja ustawiająca i pobierająca ma taką samą nazwę jak jej element.
Na przykład getter dla TypeA a nazywa się „a” i zwraca wartość typu TypeA. Odpowiedni setter również
musi mieć nazwę „a” i przyjmować parametr typu TypeA. Ustawienie wartości w safe_union aktualizuje wartość dyskryminatora zwracaną przez getDiscriminator. Dostęp do wartości z dyskryminatora, który nie jest bieżącym dyskryminatorem, powoduje przerwanie działania programu. Jeśli na przykład wywołanie getDiscriminator na instancji MySafeUnion zwraca hidl_discriminator::b, próba pobrania a spowoduje przerwanie programu.
Monostate
safe_union zawsze ma wartość, ale jeśli nie chcesz, aby miała wartość, użyj android.hidl.safe_union@1.0::Monostate jako zmiennej. Na przykład następujące połączenie może być puste noinit lub zawierać wartość foo:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };