safe_union
dans HIDL représente un type d'union explicitement tagué.
Cette méthode est semblable à union
, sauf que safe_union
assure le suivi du type sous-jacent et est compatible avec Java. Le type safe_union
est disponible dans Android 10 et versions ultérieures pour les appareils nouveaux et mis à niveau.
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 jamais qu'un seul type. Par défaut, il s'agit du premier type de l'union. Par exemple, ci-dessus, MySafeUnion
est défini par défaut sur TypeA
.
hidl-gen
génère une classe ou une structure personnalisée pour un safe_union
en C++ et en Java. Cette classe inclut un discriminateur pour chaque membre (dans hidl_discriminator
), une méthode pour obtenir le discriminateur actuel (getDiscriminator
), ainsi que des setters et des getters pour chaque membre. Chaque setter et getter porte exactement le même nom que son membre.
Par exemple, le getter pour TypeA a
est appelé "a" et renvoie quelque chose de TypeA
. Le setter correspondant est également appelé "a" et prend un paramètre de TypeA
. Définir la valeur dans un safe_union
met à jour la valeur du discriminateur telle qu'elle est renvoyée par getDiscriminator
. L'accès à une valeur à partir d'un discriminateur qui n'est pas le discriminateur actuel interrompt le programme. Par exemple, si l'appel de getDiscriminator
sur une instance de MySafeUnion
renvoie hidl_discriminator::b
, la tentative de récupération de a
interrompt le programme.
Monostate
Un safe_union
a toujours une valeur, mais si vous ne souhaitez pas en définir une, 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; };