Güvenli birleştirme

HIDL'de safe_union, açıkça etiketlenmiş bir birleştirme türünü temsil eder. Bu, union ile benzerdir. Fark, safe_union'ün temel türün kaydını tutması ve Java ile uyumlu olmasıdır. 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ı ve alıcı 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 döndürürse a'ı almaya çalışmak programı durdurur.

Tek durum

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