HIDL の safe_union は、明示的にタグ付けされた共用体型を表します。union と似ていますが、safe_union は基になる型をトラッキングし、Java と互換性がある点で異なります。safe_union 型は、Android 10 以上の新しいデバイスおよびアップグレードされたデバイスで使用できます。
構文
safe_union は、union や struct とまったく同じように HIDL で表現されます。
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};用途
実行時、safe_union は常に 1 つの型のみになります。デフォルトでは、共用体の最初の型です。上記の例では、MySafeUnion はデフォルトでは TypeA です。
hidl-gen は、safe_union のカスタムクラスまたは構造体を C++と Java の両方で生成します。このクラスには、各メンバーの弁別子(hidl_discriminator 内)、現在の弁別子を取得するメソッド(getDiscriminator)、各メンバーのセッターとゲッターが含まれます。各セッターとゲッターには、そのメンバーとまったく同じ名前が付けられます。たとえば、TypeA a のゲッターは「a」と呼ばれ、TypeA の何かを返します。対応するセッターも「a」と呼ばれ、TypeA のパラメータを受け取ります。safe_union の値を設定すると、getDiscriminator が返すとおりに弁別子の値が更新されます。現在の弁別子ではない弁別子から値にアクセスすると、プログラムは中断されます。たとえば、MySafeUnion のインスタンスで getDiscriminator を呼び出して hidl_discriminator::b が返った場合、a を取得しようとするとプログラムは中断されます。
Monostate
safe_union は常に値を持ちますが、値を持たないようにしたい場合は、android.hidl.safe_union@1.0::Monostate をプレースホルダとして使用します。たとえば、次の共用体は noinit(空白)または foo のどちらかになります。
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };