HIDL-এ safe_union একটি সুস্পষ্টভাবে ট্যাগ করা ইউনিয়ন টাইপকে বোঝায়। এটি union মতোই, তবে safe_union অন্তর্নিহিত টাইপের হিসাব রাখে এবং জাভার সাথে সামঞ্জস্যপূর্ণ। নতুন এবং আপগ্রেড করা ডিভাইসগুলোর জন্য Android 10 এবং এর পরবর্তী সংস্করণগুলোতে safe_union টাইপটি উপলব্ধ।
সিনট্যাক্স
HIDL-এ একটি safe_union ঠিক একটি union বা struct মতোই প্রকাশ করা হয়।
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};ব্যবহার
রানটাইমে, একটি safe_union সর্বদা কেবল একটি টাইপেরই হয়। ডিফল্টরূপে, এটি ইউনিয়নের প্রথম টাইপটি হয়ে থাকে। উদাহরণস্বরূপ, উপরে, MySafeUnion ডিফল্টরূপে TypeA ।
hidl-gen C++ এবং Java উভয় ভাষাতেই একটি safe_union জন্য একটি কাস্টম ক্লাস বা struct তৈরি করে। এই ক্লাসে প্রতিটি মেম্বারের জন্য একটি ডিসক্রিমিনেটর ( 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 ব্যবহার করুন। উদাহরণস্বরূপ, নিম্নলিখিত union-টি noinit (খালি) অথবা foo হতে পারে:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };