safe_union
w HIDL reprezentuje jednoznacznie oznaczony typ zjednoczenia.
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 w Androidzie 10 i nowszych na nowych i uaktualnionych urządzeniach.
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
jest tylko jednym typem. Domyślnie jest to
pierwszego typu w sumie. Na przykład powyżej
MySafeUnion
to domyślnie TypeA
.
hidl-gen
generuje niestandardową klasę lub strukturę dla obiektu
safe_union
zarówno w C++, jak i Javie. Ta klasa zawiera wyróżnik dla każdego elementu (w hidl_discriminator
), metodę do pobierania bieżącego wyróżnika (getDiscriminator
) oraz metody ustawiania i pobierania dla każdego elementu. Każda metoda ustawiająca i pobierająca ma nazwę odpowiadającą jej elementowi składowemu.
Na przykład metoda dostępu do właściwości TypeA a
nosi nazwę „a” i zwraca coś z TypeA
. Odpowiadający mu setter ma też na imię „a” i przyjmuje parametr TypeA
. Ustawienie wartości w a safe_union
aktualizuje wartość dyskryminatora zwracanego przez getDiscriminator
. Dostęp do wartości z
który nie jest obecnym dyskryminatorem, przerywa program. Dla:
w przypadku wywołania funkcji getDiscriminator
w instancji
MySafeUnion
zwraca hidl_discriminator::b
, a potem
próba pobrania parametru a
powoduje przerwanie programu.
Jednostanowe
Element safe_union
ma zawsze wartość, ale jeśli nie chcesz podawać wartości, użyj zmiennej android.hidl.safe_union@1.0::Monostate
jako elementu zastępczego. Na przykład poniższy związek może być albo
noinit
(pusty) lub foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };