safe_union
stellt in HIDL einen explizit markierten Union-Typ dar. Dies ähnelt einer union
, außer dass safe_union
den zugrunde liegenden Typ verfolgt und mit Java kompatibel ist. Der Typ safe_union
ist in Android 10 und höher für neue und aktualisierte Geräte verfügbar.
Syntax
Eine safe_union
wird in HIDL genauso ausgedrückt wie eine union
oder struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Verwendung
Zur Laufzeit ist eine safe_union
immer nur von einem Typ. Standardmäßig ist es der erste Typ in der Union. Oben ist beispielsweise MySafeUnion
standardmäßig TypeA
.
hidl-gen
generiert eine benutzerdefinierte Klasse oder Struktur für eine safe_union
in C++ und Java. Diese Klasse enthält einen Diskriminator für jedes Mitglied (in hidl_discriminator
), eine Methode zum Abrufen des aktuellen Diskriminators ( getDiscriminator
) sowie Setter und Getter für jedes Mitglied. Jeder Setter und Getter wird genau wie sein Mitglied benannt. Beispielsweise heißt der Getter für TypeA a
„a“ und gibt etwas von TypeA
zurück. Der entsprechende Setter wird ebenfalls „a“ heißen und einen Parameter von TypeA
annehmen. Durch Festlegen des Werts in einer safe_union
wird der von getDiscriminator
zurückgegebene Wert des Diskriminators aktualisiert. Der Zugriff auf einen Wert von einem Diskriminator, der nicht der aktuelle Diskriminator ist, bricht das Programm ab. Wenn beispielsweise der Aufruf von getDiscriminator
für eine Instanz von MySafeUnion
hidl_discriminator::b
zurückgibt, wird das Programm beim Versuch, a
abzurufen, abgebrochen.
Monostaat
Eine safe_union
hat immer einen Wert, aber wenn Sie keinen Wert haben möchten, verwenden Sie android.hidl.safe_union@1.0::Monostate
als Platzhalter. Beispielsweise kann die folgende Union entweder noinit
(leer) oder foo
sein:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };