सुरक्षित संघ

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