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
, C++ और Java, दोनों में किसी safe_union
के लिए कस्टम क्लास या स्ट्रक्चर जनरेट करता है. इस क्लास में हर सदस्य के लिए एक डिस्क्रिमिनेटर (hidl_discriminator
में) होता है. यह हर सदस्य के लिए, मौजूदा डिस्क्रिमिनेटर (getDiscriminator
), और सेटर और गेटर का पता लगाने का तरीका होता है. हर सेटर और गटर का नाम, उसके एलिमेंट के नाम से मेल खाता है.
उदाहरण के लिए, TypeA a
के लिए गटर को "a" कहा जाता है और यह TypeA
का कुछ दिखाता है. इससे जुड़े सेटर को "a" भी कहा जाता है और यह 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; };