A partir de 27 de março de 2025, recomendamos usar android-latest-release
em vez de aosp-main
para criar e contribuir com o AOSP. Para mais informações, consulte Mudanças no AOSP.
União segura
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
safe_union
no HIDL representa um tipo de união marcado explicitamente.
Isso é semelhante a um union
, exceto que o safe_union
mantém
o controle do tipo subjacente e é compatível com Java. O
tipo safe_union
está disponível no Android 10
e versões mais recentes 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
No momento da execução, um safe_union
é sempre de um tipo. Por padrão, é
o primeiro tipo na união. Por exemplo, acima,
MySafeUnion
é TypeA
por padrão.
hidl-gen
gera uma classe ou estrutura personalizada para um
safe_union
em C++ e Java. Essa classe inclui um
discriminador para cada membro (em hidl_discriminator
), um método para
extrair o discriminador atual (getDiscriminator
) e setters e
getters para cada membro. Cada setter e getter é nomeado exatamente como o membro.
Por exemplo, o getter de TypeA a
é chamado de "a" e
retorna algo de TypeA
. O setter correspondente também
é chamado de "a" e recebe um parâmetro de TypeA
. Definir o valor em
um safe_union
atualiza o valor do discriminador conforme
retornado por getDiscriminator
. O acesso a um valor de um
discriminador que não é o discriminador atual aborta o programa. Por
exemplo, se chamar getDiscriminator
em uma instância de
MySafeUnion
retornar hidl_discriminator::b
, a
tentativa de recuperar a
aborta o programa.
Monoestado
Um safe_union
sempre tem um valor, mas, se não
quiser ter um valor, use android.hidl.safe_union@1.0::Monostate
como um
marcador de posição. Por exemplo, a união a seguir pode ser
noinit
(vazio) ou foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-07-27 UTC."],[],[],null,["# Safe union\n\n`safe_union` in HIDL represents an explicitly tagged union type.\nThis is similar to a `union` except `safe_union` keeps\ntrack of the underlying type and is compatible with Java. The\n`safe_union` type is available in Android 10\nand higher for new and upgraded devices.\n\nSyntax\n------\n\nA `safe_union` is expressed in HIDL exactly like a\n`union` or `struct`. \n\n```scdoc\nsafe_union MySafeUnion {\n TypeA a;\n TypeB b;\n ...\n};\n```\n\nUsage\n-----\n\nAt runtime, a `safe_union` is only ever one type. By default, it's\nthe first type in the union. For instance, above,\n`MySafeUnion` is by default `TypeA`.\n\n`hidl-gen` generates a custom class or struct for a\n`safe_union` in both C++ and Java. This class includes a\ndiscriminator for each member (in `hidl_discriminator`), a method to\nget the current discriminator (`getDiscriminator`), and setters and\ngetters for each member. Each setter and getter is named exactly as its member.\nFor instance, the getter for `TypeA a` is called \"a\", and it\nreturns something of `TypeA`. The corresponding setter is also\nbe called \"a\" and takes a parameter of `TypeA`. Setting the value in\na `safe_union` updates the value of the discriminator as\nreturned by `getDiscriminator`. Accessing a value from a\ndiscriminator that isn't the current discriminator aborts the program. For\ninstance, if calling `getDiscriminator` on an instance of\n`MySafeUnion` returns `hidl_discriminator::b`, then\ntrying to retrieve `a` aborts the program.\n\nMonostate\n---------\n\nA `safe_union` always has a value, but if it is desired to not\nhave a value, use `android.hidl.safe_union@1.0::Monostate` as a\nplaceholder. For instance, the following union can either be\n`noinit` (empty) or `foo`: \n\n```python\nimport android.hidl.safe_union@1.0::Monostate;\n\nsafe_union OptionalFoo {\n Monostate noinit;\n Foo foo;\n};\n```"]]