Bezpieczna Unia

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