safe_union en HIDL representa un tipo de unión etiquetado explícitamente.
Es similar a un union, excepto que safe_union hace un seguimiento del tipo subyacente y es compatible con Java. El tipo safe_union está disponible en Android 10 y versiones posteriores para dispositivos nuevos y actualizados.
Sintaxis
Un safe_union se expresa en HIDL exactamente igual que un union o un struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Uso
En el tiempo de ejecución, un safe_union siempre es de un solo tipo. De forma predeterminada, es el primer tipo de la unión. Por ejemplo, arriba, MySafeUnion es TypeA de forma predeterminada.
hidl-gen genera una clase o struct personalizado para un safe_union en C++ y Java. Esta clase incluye un discriminador para cada miembro (en hidl_discriminator), un método para obtener el discriminador actual (getDiscriminator) y métodos de configuración y obtención para cada miembro. Cada método setter y getter se denomina exactamente igual que su miembro.
Por ejemplo, el getter para TypeA a se llama "a" y devuelve algo de TypeA. El método setter correspondiente también se llama "a" y toma un parámetro de TypeA. Establecer el valor en un safe_union actualiza el valor del discriminador que devuelve getDiscriminator. Si se accede a un valor de un discriminador que no es el actual, se anula el programa. Por ejemplo, si llamar a getDiscriminator en una instancia de MySafeUnion devuelve hidl_discriminator::b, intentar recuperar a aborta el programa.
Monostate
Un safe_union siempre tiene un valor, pero si no se desea que tenga un valor, usa android.hidl.safe_union@1.0::Monostate como marcador de posición. Por ejemplo, la siguiente unión puede ser noinit (vacía) o foo:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };