HIDL में safe_union
स्पष्ट रूप से टैग किए गए यूनियन प्रकार का प्रतिनिधित्व करता है। यह एक union
के समान है सिवाय इसके कि safe_union
अंतर्निहित प्रकार का ट्रैक रखता है और जावा के साथ संगत है। safe_union
प्रकार नए और उन्नत उपकरणों के लिए एंड्रॉइड 10 और उच्चतर में उपलब्ध है।
वाक्य - विन्यास
एक safe_union
एचआईडीएल में बिल्कुल union
या struct
की तरह व्यक्त किया जाता है।
safe_union MySafeUnion { TypeA a; TypeB b; ... };
प्रयोग
रनटाइम पर, safe_union
केवल एक ही प्रकार का होता है। डिफ़ॉल्ट रूप से, यह संघ में पहला प्रकार होगा। उदाहरण के लिए, ऊपर, MySafeUnion
डिफ़ॉल्ट रूप से TypeA
है।
hidl-gen
C++ और Java दोनों में safe_union
के लिए एक कस्टम क्लास या स्ट्रक्चर तैयार करता है। इस वर्ग में प्रत्येक सदस्य के लिए एक विवेचक ( hidl_discriminator
में), वर्तमान विवेचक ( getDiscriminator
) प्राप्त करने की एक विधि, और प्रत्येक सदस्य के लिए सेटर्स और गेटर्स शामिल हैं। प्रत्येक सेटर और गेटर को बिल्कुल उसके सदस्य के रूप में नामित किया गया है। उदाहरण के लिए, TypeA a
के लिए गेटर को "ए" कहा जाएगा, और यह TypeA
का कुछ लौटाएगा। संबंधित सेटर को "ए" भी कहा जाएगा और TypeA
का एक पैरामीटर लिया जाएगा। safe_union
में मान सेट करने से विवेचक का मान अपडेट हो जाएगा जैसा कि getDiscriminator
द्वारा दिया गया है। किसी विवेचक से उस मान तक पहुँचना जो वर्तमान विवेचक नहीं है, प्रोग्राम को निरस्त कर देता है। उदाहरण के लिए, यदि MySafeUnion
के उदाहरण पर getDiscriminator
कॉल करने पर hidl_discriminator::b
मिलता है, तो a
पुनः प्राप्त करने का प्रयास करने से प्रोग्राम निरस्त हो जाएगा।
मोनोस्टेट
एक 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; };