safe_union
em HIDL representa um tipo de união explicitamente marcado. Isso é semelhante a uma union
, exceto que safe_union
controla o tipo subjacente e é compatível com Java. O tipo safe_union
está disponível no Android 10 e versões posteriores para dispositivos novos e atualizados.
Sintaxe
Um safe_union
é expresso em HIDL exatamente como um union
ou struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Uso
Em tempo de execução, um safe_union
é sempre de um tipo. Por padrão, será o primeiro tipo da união. Por exemplo, acima, MySafeUnion
é por padrão TypeA
.
hidl-gen
gera uma classe ou estrutura personalizada para um safe_union
em C++ e Java. Esta classe inclui um discriminador para cada membro (em hidl_discriminator
), um método para obter o discriminador atual ( getDiscriminator
) e setters e getters para cada membro. Cada setter e getter é nomeado exatamente como seu membro. Por exemplo, o getter para TypeA a
será chamado de "a" e retornará algo de TypeA
. O setter correspondente também será chamado de "a" e terá um parâmetro TypeA
. Definir o valor em safe_union
atualizará o valor do discriminador conforme retornado por getDiscriminator
. Acessar um valor de um discriminador que não seja o discriminador atual aborta o programa. Por exemplo, se chamar getDiscriminator
em uma instância de MySafeUnion
retornar hidl_discriminator::b
, tentar recuperar a
cancelará o programa.
Monoestado
Um safe_union
sempre tem um valor, mas se desejar não ter um valor, use android.hidl.safe_union@1.0::Monostate
como espaço reservado. Por exemplo, a seguinte união pode ser noinit
(vazia) ou foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };