safe_union
in HIDL steht für einen explizit getaggten Union-Typ.
Das ist mit einem union
vergleichbar, mit der Ausnahme, dass safe_union
den zugrunde liegenden Typ im Blick behält und mit Java kompatibel ist. Der Typ safe_union
ist unter Android 10 und höher für neue und aktualisierte Geräte verfügbar.
Syntax
Ein safe_union
wird in HIDL genau wie union
oder struct
ausgedrückt.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Nutzung
Bei der Laufzeit hat ein safe_union
immer nur einen Typ. Standardmäßig ist dies der erste Typ in der Union. Im obigen Beispiel ist MySafeUnion
standardmäßig TypeA
.
hidl-gen
generiert eine benutzerdefinierte Klasse oder Struktur für eine safe_union
sowohl in C++ als auch in 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 hat genau denselben Namen wie sein Mitglied.
Der Getter für TypeA a
heißt beispielsweise "a" und gibt TypeA
zurück. Der entsprechende Setter wird ebenfalls „a“ genannt und nimmt einen Parameter vom Typ TypeA
an. Wenn du den Wert in einer safe_union
festlegst, wird der Wert des Discriminators aktualisiert, der von getDiscriminator
zurückgegeben wird. Wenn Sie auf einen Wert aus einem anderen Discriminator zugreifen, wird das Programm abgebrochen. Wenn beispielsweise beim Aufrufen von getDiscriminator
für eine Instanz von MySafeUnion
hidl_discriminator::b
zurückgegeben wird, wird das Programm durch den Abruf von a
abgebrochen.
Monostate
safe_union
hat immer einen Wert. Wenn kein Wert gewünscht ist, verwenden Sie android.hidl.safe_union@1.0::Monostate
als Platzhalter. Die folgende Union kann beispielsweise entweder noinit
(leer) oder foo
sein:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };