HIDL'deki safe_union
, açık şekilde etiketlenmiş bir birlik türünü temsil eder.
Bu, union
ile benzerdir ancak safe_union
şunları korur:
temel türü izler ve Java ile uyumludur. İlgili içeriği oluşturmak için kullanılan
safe_union
türü, Android 10'da kullanılabilir
yeni ve yükseltilmiş cihazlar için
daha yüksek olduğunu unutmayın.
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
yalnızca bir türdür. Varsayılan olarak
sendikadaki ilk tü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 belirleyici ve alıcı tam olarak üyesinin adını alı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. Bir
o ayrımcı programı iptal eder. Örneğin, MySafeUnion
örneğinde getDiscriminator
çağrısı hidl_discriminator::b
döndürüyorsa a
'ı almaya çalışmak programı durdurur.
Tek statü
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şimi
noinit
(boş) veya foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };