Безопасное объединение

safe_union в HIDL представляет собой явно помеченный тип объединения. Это похоже на 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), а также методы установки и получения значений для каждого участника. Названия методов setter и getter совпадают с названиями элементов. Например, геттер для TypeA a называется "a" и возвращает значение типа TypeA. Соответствующий метод установки также называется "a" и принимает параметр типа TypeA. Если задать значение в поле safe_union, то значение дискриминатора, возвращаемое функцией getDiscriminator, обновится. Если вы попытаетесь получить значение из дискриминатора, который не является текущим, программа будет прервана. Например, если при вызове метода getDiscriminator для экземпляра класса MySafeUnion возвращается значение hidl_discriminator::b, то попытка получить значение a приведет к аварийному завершению программы.

Monostate

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

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

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};