Bezpieczne zjednoczenie

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

W HIDL element safe_union jest wyrażany dokładnie tak samo jak element 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. 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 ustawiająca i pobierająca ma nazwę odpowiadającą jej elementowi składowemu. Na przykład metoda dostępu do właściwości 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. 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

Element safe_union ma zawsze wartość, ale jeśli nie chcesz podawać wartości, użyj zmiennej android.hidl.safe_union@1.0::Monostate jako elementu zastępczego. 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;
};