União Segura

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