Bezpieczne zjednoczenie

safe_union w HIDL oznacza typ unii z wyraźnym tagiem. 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 jeden 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 dyskryminator dla każdego elementu (w hidl_discriminator), metodę pobierania bieżącego dyskryminatora (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 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 działania 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 foo:

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};