Union sécurisée

safe_union dans HIDL représente un type d'union explicitement tagué. Cette méthode est semblable à union, sauf que safe_union conserve du 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 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 est 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. Ce cours comprend une discriminateur pour chaque membre (dans hidl_discriminator), une méthode pour obtenir le discriminateur actuel (getDiscriminator), les 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. Si vous accédez à une valeur à partir d'un un discriminateur qui n'est pas le discriminateur actuel abandonne 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 une valeur, utilisez android.hidl.safe_union@1.0::Monostate comme valeur . 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;
};