safe_union
dans HIDL représente un type d'union explicitement balisé. Ceci est similaire à une union
sauf que safe_union
garde une trace 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
Une safe_union
est exprimée en HIDL exactement comme une union
ou struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Usage
Au moment de l'exécution, un safe_union
n'est qu'un seul type. Par défaut, ce sera le premier type de l'union. Par exemple, ci-dessus, MySafeUnion
est par défaut TypeA
.
hidl-gen
génère une classe ou une structure personnalisée pour un safe_union
en C++ et Java. Cette classe comprend un discriminateur pour chaque membre (dans hidl_discriminator
), une méthode pour obtenir le discriminateur actuel ( getDiscriminator
), ainsi que des setters et getters pour chaque membre. Chaque setter et getter est nommé exactement comme son membre. Par exemple, le getter pour TypeA a
sera appelé "a", et il renverra quelque chose de TypeA
. Le setter correspondant sera également appelé "a" et prendra un paramètre de TypeA
. La définition de la valeur dans un safe_union
mettra à jour la valeur du discriminateur telle que renvoyée par getDiscriminator
. L'accès à une valeur d'un discriminateur qui n'est pas le discriminateur actuel abandonne le programme. Par exemple, si l'appel de getDiscriminator
sur une instance de MySafeUnion
renvoie hidl_discriminator::b
, alors essayer de récupérer a
annulera le programme.
Monoétat
Un safe_union
a toujours une valeur, mais si vous souhaitez ne pas avoir de valeur, 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; };