Sichere Union

safe_union stellt in HIDL einen explizit markierten Union-Typ dar. Dies ähnelt einer union , außer 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

Eine safe_union wird in HIDL genauso ausgedrückt wie eine union oder struct .

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

Verwendung

Zur Laufzeit ist eine safe_union immer nur von einem Typ. Standardmäßig ist es der erste Typ in der Union. Oben ist beispielsweise MySafeUnion standardmäßig TypeA .

hidl-gen generiert eine benutzerdefinierte Klasse oder Struktur für eine 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. Jeder Setter und Getter wird genau wie sein Mitglied benannt. Beispielsweise heißt der Getter für TypeA a „a“ und gibt etwas von TypeA zurück. Der entsprechende Setter wird ebenfalls „a“ heißen und einen Parameter von TypeA annehmen. Durch Festlegen des Werts in einer safe_union wird der von getDiscriminator zurückgegebene Wert des Diskriminators aktualisiert. Der Zugriff auf einen Wert von einem Diskriminator, der nicht der aktuelle Diskriminator ist, bricht das Programm ab. Wenn beispielsweise der Aufruf von getDiscriminator für eine Instanz von MySafeUnion hidl_discriminator::b zurückgibt, wird das Programm beim Versuch, a abzurufen, abgebrochen.

Monostaat

Eine safe_union hat immer einen Wert, aber wenn Sie keinen Wert haben möchten, verwenden Sie android.hidl.safe_union@1.0::Monostate als Platzhalter. Beispielsweise kann die folgende Union entweder noinit (leer) oder foo sein:

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

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};