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