HIDL'deki safe_union
, açıkça etiketlenmiş bir birleşim türünü temsil eder.
Bu, union
öğesine 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 bir safe_union
her zaman tek bir türdür. Varsayılan olarak, birleşimdeki ilk türdür. Örneğin, yukarıdaki örnekte MySafeUnion
varsayılan olarak TypeA
'dir.
hidl-gen
hem C++ hem de Java'da safe_union
için özel bir sınıf veya yapı oluşturur. Bu sınıfta her üye için bir ayrıştırıcı (hidl_discriminator
içinde), mevcut ayrıştırıcıyı alma yöntemi (getDiscriminator
) ve her üye için ayarlayıcılar ve alıcılar bulunur. Her ayarlayıcı ve alıcı, üyesiyle aynı şekilde adlandırılır.
Örneğin, TypeA a
için getter "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
parametresini alır. Değeri safe_union
içinde ayarlamak, getDiscriminator
tarafından döndürülen ayırıcı değerini günceller. Mevcut ayırıcı olmayan bir ayırıcıdan değere erişildiğinde program sonlandırılır. Örneğin, MySafeUnion
örneğinde getDiscriminator
çağrısı hidl_discriminator::b
değerini döndürüyorsa a
değerini almaya çalışmak programı durdurur.
Monostate
safe_union
her zaman bir değere sahiptir ancak değer içermemesi isteniyorsa yer tutucu olarak android.hidl.safe_union@1.0::Monostate
kullanılabilir. Örneğin, aşağıdaki birleşim noinit
(boş) veya foo
olabilir:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };