Związek bezpieczeństwa

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

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 pierwszy typ w zbiorze. Na przykład w przykładzie powyżej zmienna MySafeUnion ma domyślnie wartość TypeA.

hidl-gen generuje niestandardową klasę lub strukturę dla safe_union w C++ i Java. 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 setter i getter ma taką samą nazwę co odpowiednia metoda członkowska. Na przykład metoda dostępu do 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. Uzyskanie dostępu do wartości z elementu dyskryminującego, który nie jest bieżącym elementem dyskryminującym, powoduje przerwanie programu. Jeśli na przykład wywołanie getDiscriminator w instancji MySafeUnion zwraca wartość hidl_discriminator::b, próba pobrania wartości a powoduje przerwanie programu.

Monostate

Element safe_union ma zawsze wartość, ale jeśli nie chcesz podawać wartości, użyj elementu android.hidl.safe_union@1.0::Monostate jako zmiennej. Na przykład ta operacja union może być noinit (pusta) lub foo:

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};