safe_union in HIDL stellt einen explizit getaggten Union-Typ dar.
Er ähnelt einem union-Typ, mit dem Unterschied, 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
Ein safe_union wird in HIDL genau wie ein
union oder struct ausgedrückt.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Nutzung
Zur Laufzeit ist ein safe_union-Typ immer nur ein Typ. Standardmäßig ist es der erste Typ in der Union. Im obigen Beispiel ist MySafeUnion standardmäßig TypeA.
hidl-gen generiert sowohl in C++ als auch in Java eine benutzerdefinierte Klasse oder Struktur für einen safe_union-Typ. 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.
Der Getter für TypeA a heißt beispielsweise „a“ und gibt etwas vom Typ TypeA zurück. Der entsprechende Setter heißt ebenfalls „a“ und akzeptiert einen Parameter vom Typ TypeA. Wenn Sie den Wert in einem safe_union-Typ festlegen, wird der Wert des Diskriminators aktualisiert, der von getDiscriminator zurückgegeben wird. Wenn Sie auf einen Wert aus einem Diskriminator zugreifen, der nicht der aktuelle Diskriminator ist, wird das Programm abgebrochen. Wenn
beispielsweise der Aufruf von getDiscriminator für eine Instanz von
MySafeUnion den Wert hidl_discriminator::b zurückgibt, wird das Programm abgebrochen, wenn Sie
versuchen, a abzurufen.
Monostate
Ein safe_union hat immer einen Wert. Wenn Sie keinen Wert
haben möchten, 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; };