নিরাপদ ইউনিয়ন

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 জন্য একটি কাস্টম ক্লাস বা কাঠামো তৈরি করে। এই শ্রেণীতে প্রতিটি সদস্যের জন্য একটি বৈষম্যকারী অন্তর্ভুক্ত রয়েছে ( 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;
};