Güvenli birleştirme

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