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
safe_union
jest wyrażony w HIDL dokładnie tak, jak 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 pierwszy typ w zbiorze. Na przykład w przykładzie powyżej zmienna MySafeUnion
ma domyślnie wartość TypeA
.
hidl-gen
generuje niestandardową klasę lub strukturę dla safe_union
w C++ i Java. 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 setter i getter ma taką samą nazwę co odpowiednia metoda członkowska.
Na przykład metoda dostępu do 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
. Uzyskanie dostępu do wartości z elementu dyskryminującego, który nie jest bieżącym elementem dyskryminującym, powoduje przerwanie programu. Jeśli na przykład wywołanie getDiscriminator
w instancji MySafeUnion
zwraca wartość hidl_discriminator::b
, próba pobrania wartości a
powoduje przerwanie programu.
Monostate
Element safe_union
ma zawsze wartość, ale jeśli nie chcesz podawać wartości, użyj elementu android.hidl.safe_union@1.0::Monostate
jako zmiennej. Na przykład ta operacja union może być noinit
(pusta) lub foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};