Sichere Verbindung

safe_union in HIDL stellt einen explizit getaggten Union-Typ dar. Dies ähnelt einem union, mit dem Unterschied, dass safe_union den zugrunde liegenden Typ im Blick behält 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 immer nur ein Typ. Standardmäßig ist das der erste Typ in der Union. Im obigen Beispiel ist MySafeUnion standardmäßig TypeA.

hidl-gen generiert eine benutzerdefinierte Klasse oder Struktur für ein 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. Jede Setter- und Getter-Methode wird genau wie das zugehörige Mitglied benannt. Der Getter für TypeA a heißt beispielsweise „a“ und gibt etwas vom Typ TypeA zurück. Der entsprechende Setter wird ebenfalls „a“ genannt und akzeptiert einen Parameter vom Typ TypeA. Wenn Sie den Wert in einem safe_union 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 beim Aufrufen von getDiscriminator für eine Instanz von MySafeUnion der Wert hidl_discriminator::b zurückgegeben wird, wird das Programm abgebrochen, wenn versucht wird, a abzurufen.

Monostate

Ein safe_union hat immer einen Wert. Wenn Sie keinen Wert verwenden möchten, verwenden Sie android.hidl.safe_union@1.0::Monostate als Platzhalter. Die folgende Vereinigung kann beispielsweise entweder noinit (leer) oder foo sein:

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};