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