Bezpieczne zjednoczenie

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