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