Güvenli Birlik

HIDL'deki safe_union açıkça etiketlenmiş bir birleşim türünü temsil eder. safe_union temel türü takip etmesi ve Java ile uyumlu olması dışında bu union benzer. safe_union türü, yeni ve yükseltilmiş cihazlar için Android 10 ve üzeri sürümlerde mevcuttur.

Sözdizimi

safe_union HIDL'de tam olarak bir union veya struct gibi ifade edilir.

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

Kullanım

Çalışma zamanında, safe_union yalnızca bir türdür. Varsayılan olarak birleşimdeki ilk tür olacaktır. Örneğin, yukarıda MySafeUnion varsayılan olarak TypeA .

hidl-gen hem C++ hem de Java'da bir safe_union için özel bir sınıf veya yapı oluşturur. Bu sınıf, her üye için bir ayırıcı ( hidl_discriminator içinde), geçerli ayırıcıyı ( getDiscriminator ) elde etmek için bir yöntem ve her üye için ayarlayıcılar ve alıcılar içerir. Her pasör ve alıcı, tam olarak üyesi olarak adlandırılır. Örneğin, TypeA a alıcısına "a" adı verilecek ve TypeA türünden bir şey döndürecektir. İlgili ayarlayıcı aynı zamanda "a" olarak adlandırılacak ve TypeA parametresini alacaktır. Değerin bir safe_union ayarlanması, getDiscriminator tarafından döndürülen ayırıcının değerini güncelleyecektir. Geçerli ayırıcı olmayan bir ayırıcıdan bir değere erişilmesi programı iptal eder. Örneğin, MySafeUnion örneğinde getDiscriminator çağrıldığında hidl_discriminator::b değeri döndürülürse, a almaya çalışmak programın iptal edilmesine neden olur.

Tek durumlu

safe_union her zaman bir değeri vardır, ancak bir değere sahip olmaması isteniyorsa yer tutucu olarak android.hidl.safe_union@1.0::Monostate kullanın. Ö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;
};