Güvenli birleştirme

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