Güvenli birleştirme

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