Safe Union

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