safe_union
w HIDL reprezentuje jawnie otagowany typ sumy.
Jest podobny do elementu union
, z tym że zachodzi funkcja safe_union
typu bazowego i jest zgodny z Javą.
Typ safe_union
jest dostępny w Androidzie 10
i wyższej 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
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. Te zajęcia obejmują:
jest wyróżnikiem każdego użytkownika (w hidl_discriminator
). Jest to metoda
pobierz aktualny dyskryminator (getDiscriminator
) i setery oraz
dla każdego użytkownika. Każda metoda ustawiająca i pobierająca ma nazwę odpowiadającą jej elementowi składowemu.
Na przykład moduł pobierający dla TypeA a
nazywa się „a” i
zwraca wartość TypeA
. Odpowiednia metoda ustawiająca jest również
być nazywane „a” i przyjmuje parametr o wartości TypeA
. Ustawianie wartości w argumencie
safe_union
aktualizuje wartość dyskryminatora jako
zwrócone 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
safe_union
zawsze ma wartość, ale jeśli nie jest to konieczne
mają wartość, użyj android.hidl.safe_union@1.0::Monostate
jako
. 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; };