Safe Union

safe_union in HIDL steht für einen explizit getaggten Union-Typ. Dies ähnelt einem union, mit dem Unterschied, dass in safe_union des zugrunde liegenden Typs definiert und mit Java kompatibel ist. Die Der Typ „safe_union“ ist in Android 10 verfügbar und höher für neue und aktualisierte Geräte.

Syntax

Ein safe_union wird in HIDL genau wie union oder struct.

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

Nutzung

Zur Laufzeit ist ein safe_union immer nur ein Typ. Standardmäßig ist es den ersten Typ in der Vereinigung. Oben haben wir zum Beispiel MySafeUnion ist standardmäßig auf TypeA gesetzt.

hidl-gen generiert eine benutzerdefinierte Klasse oder Struktur für ein safe_union in C++ und Java. Dieser Kurs umfasst Folgendes: Diskriminator für jedes Mitglied (in hidl_discriminator), eine Methode, aktuellen Diskriminator (getDiscriminator), Setter und für jedes Mitglied zu generieren. Jeder Setter und Getter wird genau wie sein Mitglied benannt. Der Getter für TypeA a heißt beispielsweise „a“ und gibt etwas von TypeA zurück. Der entsprechende Setter ist ebenfalls heißen „eine“ und verwendet den Parameter TypeA. Festlegen des Werts in Ein safe_union aktualisiert den Wert des Diskriminators als zurückgegeben von getDiscriminator. Zugriff auf einen Wert aus einem Diskriminator, der nicht der aktuelle Diskriminator ist, bricht das Programm ab. Für Instanz, wenn getDiscriminator für eine Instanz von MySafeUnion gibt hidl_discriminator::b zurück, dann a bricht das Programm ab.

Einfarbig

Ein safe_union hat immer einen Wert, aber wenn dieser nicht verwendet werden soll, einen Wert haben, verwenden Sie android.hidl.safe_union@1.0::Monostate als . Die folgende Union kann beispielsweise noinit (leer) oder foo:

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

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};