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; };