Безопасный союз

В HIDL safe_union представляет собой явно помеченный тип объединения. Это похоже на обычное union за исключением того, что safe_union отслеживает базовый тип и совместим с Java. Тип safe_union доступен в Android 10 и выше для новых и обновленных устройств.

Синтаксис

В языке HIDL safe_union выражается точно так же, как union или struct .

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

Использование

Во время выполнения safe_union всегда имеет только один тип. По умолчанию это первый тип в объединении. Например, как показано выше, MySafeUnion по умолчанию имеет TypeA .

hidl-gen генерирует пользовательский класс или структуру для safe_union как на C++, так и на Java. Этот класс включает дискриминатор для каждого члена (в hidl_discriminator ), метод для получения текущего дискриминатора ( getDiscriminator ), а также сеттеры и геттеры для каждого члена. Каждый сеттер и геттер названы точно так же, как и его член. Например, геттер для TypeA a называется "a" и возвращает значение TypeA Соответствующий сеттер также называется "a" и принимает параметр TypeA Установка значения в safe_union обновляет значение дискриминатора, возвращаемое getDiscriminator . Доступ к значению из дискриминатора, которое не является текущим дискриминатором, прерывает программу. Например, если вызов getDiscriminator для экземпляра MySafeUnion возвращает hidl_discriminator::b , то попытка получить значение a прерывает программу.

Моногосударство

Объект safe_union всегда имеет значение, но если требуется, чтобы он не имел значения, используйте android.hidl.safe_union@1.0::Monostate в качестве заполнителя. Например, следующий объект union может быть либо noinit (пустой), либо foo :

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};