Związek bezpieczeństwa

safe_union w HIDL reprezentuje jawnie otagowany typ sumy. Jest podobna do union, z tym że zachodzi 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;
};