HIDL'deki safe_union
, açık şekilde etiketlenmiş bir birlik türünü temsil eder.
Bu, union
özelliğine benzer ancak safe_union
, temel türü izler ve Java ile uyumludur. safe_union
türü, yeni ve yükseltilmiş cihazlarda Android 10 ve sonraki sürümlerde kullanılabilir.
Sözdizimi
safe_union
, HIDL'de tam olarak union
veya struct
gibi ifade edilir.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Kullanım
Çalışma zamanında safe_union
her zaman tek bir türdedir. Varsayılan olarak, birleşmedeki ilk türdür. Örneğin, yukarıdaki örnekte MySafeUnion
varsayılan olarak TypeA
değerine sahiptir.
hidl-gen
, hem C++ hem de Java'da safe_union
için özel bir sınıf veya yapı oluşturur. Bu sınıf, her üye için bir ayırt edici (hidl_discriminator
içinde), mevcut ayırt ediciyi (getDiscriminator
) alma yöntemi ve her üye için ayarlayıcılar ve alıcıları içerir. Her ayarlayıcı ve alıcı, üyesiyle tam olarak aynı şekilde adlandırılır.
Örneğin, TypeA a
için alıcı "a" olarak adlandırılır ve TypeA
türünde bir değer döndürür. İlgili ayarlayıcı da "a" olarak adlandırılır ve TypeA
parametresi alır. Değeri bir safe_union
içinde ayarlamak, ayırıcının değerini getDiscriminator
tarafından döndürülen şekilde günceller. Mevcut ayırıcı olmayan bir ayırıcıdan bir değere erişmek programı durdurur. Örneğin, MySafeUnion
örneğinde getDiscriminator
çağrısı, hidl_discriminator::b
sonucunu döndürürse a
yöntemini almaya çalışmak programı iptal eder.
Monostate
safe_union
her zaman bir değere sahiptir ancak değer olmaması isteniyorsa yer tutucu olarak android.hidl.safe_union@1.0::Monostate
kullanın. Örneğin, aşağıdaki birleştirme noinit
(boş) veya foo
olabilir:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };