Sichere Verbindung

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