Syndicat sécurisé

safe_union dans HIDL représente un type d'union explicitement tagué. Cette méthode est semblable à une union, à l'exception de safe_union, qui suit le type sous-jacent et est compatible avec Java. La Le type safe_union est disponible dans Android 10 et plus élevés pour les appareils neufs et plus récents.

Syntaxe

Un safe_union est exprimé en HIDL exactement comme un union ou un struct.

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

Utilisation

Lors de l'exécution, un safe_union n'est qu'un seul type. Par défaut, il s'agit le premier type de l'union. Par exemple, ci-dessus, La valeur par défaut de MySafeUnion est TypeA.

hidl-gen génère une classe ou un struct personnalisé pour un safe_union en C++ et Java. Cette classe inclut un discriminateur pour chaque membre (dans hidl_discriminator), une méthode permettant d'obtenir le discriminateur actuel (getDiscriminator), ainsi que des setters et des getters pour chaque membre. Chaque setter et getter porte le nom exact de son membre. Par exemple, le getter de TypeA a s'appelle "a". renvoie TypeA. Le setter correspondant est également être désigné par "un" et accepte un paramètre de TypeA. Définir la valeur dans Un safe_union met à jour la valeur du discriminateur comme suit : renvoyé par getDiscriminator. L'accès à une valeur à partir d'un discriminateur qui n'est pas le discriminateur actuel interrompt le programme. Pour instance, si vous appelez getDiscriminator sur une instance de MySafeUnion renvoie hidl_discriminator::b, puis la tentative de récupération de a annule le programme.

Monostate

Un safe_union a toujours une valeur, mais si vous ne souhaitez pas en avoir, utilisez android.hidl.safe_union@1.0::Monostate comme espace réservé. Par exemple, l'union suivante peut être noinit (vide) ou foo :

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

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};