HIDL의 safe_union
은 태그가 명시적으로 지정된 공용체 형식을 나타냅니다.
이는 safe_union
이 기본 형식을 추적하고 자바와 호환된다는 지원한다는 점을 제외하고는 union
과 유사합니다. 새 기기 및 업그레이드된 기기의 경우 Android 10 이상에서 safe_union
형식을 사용할 수 있습니다.
구문
safe_union
은 HIDL에서 정확히 union
또는 struct
처럼 표현됩니다.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
사용
런타임에서 safe_union
은 하나의 형식일 뿐입니다. 기본적으로 이 형식이 공용체의 첫 번째 형식이 됩니다. 예를 들어 위의 MySafeUnion
은 기본적으로 TypeA
입니다.
hidl-gen
은 C++ 및 자바에서 safe_union
을 위한 맞춤 클래스 또는 구조체를 생성합니다. 이 클래스에는 각 멤버의 판별자(hidl_discriminator
로 나타냄), 현재 판별자(getDiscriminator
)를 가져오기 위한 메서드, 각 멤버의 setter와 getter가 포함됩니다. 각 setter 및 getter의 이름은 멤버와 동일하게 지정됩니다.
예를 들어 TypeA a
의 getter는 'a'라고 불리며 TypeA
의 무언가를 반환합니다. 상응하는 setter도 'a'라고 불리며 TypeA
의 매개변수를 사용합니다. safe_union
의 값을 설정하면 getDiscriminator
가 반환한 값으로 판별자의 값이 업데이트됩니다. 현재 판별자가 아닌 판별자에서 값에 액세스하면 프로그램이 중단됩니다. 예를 들어 MySafeUnion
의 인스턴스에서 getDiscriminator
를 호출하여 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; };