safe_union
w HIDL reprezentuje jawnie oznaczony typ unii. Jest to podobne do union
, z tą różnicą, że safe_union
śledzi typ bazowy i jest kompatybilny z Javą. Typ safe_union
jest dostępny w systemie Android 10 i nowszych wersjach dla nowych i ulepszonych urządzeń.
Składnia
safe_union
jest wyrażany w języku HIDL dokładnie tak samo jak union
lub struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Stosowanie
W czasie wykonywania safe_union
jest zawsze tylko jednym typem. Domyślnie będzie to pierwszy typ w unii. Na przykład powyżej MySafeUnion
to domyślnie TypeA
.
hidl-gen
generuje niestandardową klasę lub strukturę dla safe_union
zarówno w C++, jak i Javie. Ta klasa zawiera dyskryminator dla każdego elementu członkowskiego (w hidl_discriminator
), metodę pobierania bieżącego dyskryminatora ( getDiscriminator
) oraz elementy ustawiające i pobierające dla każdego elementu członkowskiego. Każdy seter i getter ma nazwę dokładnie taką samą, jak jego element członkowski. Na przykład moduł pobierający dla TypeA a
będzie nazywany „a” i zwróci coś z TypeA
. Odpowiedni setter będzie również nazywany „a” i przyjmie parametr TypeA
. Ustawienie wartości w safe_union
zaktualizuje wartość dyskryminatora zwróconą przez getDiscriminator
. Dostęp do wartości z dyskryminatora, który nie jest bieżącym dyskryminatorem, powoduje przerwanie programu. Na przykład, jeśli wywołanie getDiscriminator
w instancji MySafeUnion
zwróci hidl_discriminator::b
, wówczas próba pobrania a
spowoduje przerwanie programu.
Monostan
safe_union
zawsze ma wartość, ale jeśli nie chcesz mieć wartości, użyj android.hidl.safe_union@1.0::Monostate
jako symbolu zastępczego. Na przykład następująca unia może być noinit
(pusta) lub foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };