safe_union
en HIDL representa un tipo de unión etiquetado explícitamente. Esto es similar a una union
excepto safe_union
realiza un seguimiento del tipo subyacente y es compatible con Java. El tipo safe_union
está disponible en Android 10 y superior para dispositivos nuevos y actualizados.
Sintaxis
Una unión segura se expresa en safe_union
exactamente como una union
o una struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Uso
En tiempo de ejecución, una safe_union
es solo de un tipo. Por defecto, será el primer tipo en la unión. Por ejemplo, arriba, MySafeUnion
es por defecto TypeA
.
hidl-gen
genera una clase o estructura personalizada para una safe_union
tanto en C++ como en Java. Esta clase incluye un discriminador para cada miembro (en hidl_discriminator
), un método para obtener el discriminador actual ( getDiscriminator
) y setters y getters para cada miembro. Cada setter y getter se nombra exactamente como su miembro. Por ejemplo, el getter para TypeA a
se llamará "a", y devolverá algo de TypeA
. El setter correspondiente también se llamará "a" y tomará un parámetro de TypeA
. Establecer el valor en un safe_union
actualizará el valor del discriminador como lo devuelve getDiscriminator
. Acceder a un valor de un discriminador que no es el discriminador actual aborta el programa. Por ejemplo, si llamar a getDiscriminator
en una instancia de MySafeUnion
devuelve hidl_discriminator::b
, al intentar recuperar a
anulará el programa.
monoestado
Un safe_union
siempre tiene un valor, pero si desea que no tenga un valor, use android.hidl.safe_union@1.0::Monostate
como marcador de posición. Por ejemplo, la siguiente unión puede ser noinit
(vacío) o foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };