Sealed Classes এর ব্যবহার
কটলিনে Sealed Classes এমন একটি ফিচার যা অ্যাবস্ট্রাক্ট ক্লাসের একটি বিশেষ রূপ হিসেবে কাজ করে। এটি একটি হায়ারার্কি তৈরি করতে সাহায্য করে যেখানে নির্দিষ্ট কিছু ক্লাস শুধুমাত্র একটি নির্দিষ্ট সেটের অন্তর্গত হতে পারে। Sealed ক্লাসগুলো মূলত Type-Safety এবং Exhaustive Checking নিশ্চিত করার জন্য ব্যবহৃত হয়।
Sealed Classes সাধারণত তখন ব্যবহার করা হয় যখন আপনি একটি স্থির এবং পূর্বনির্ধারিত সাবক্লাসগুলোর সেট তৈরি করতে চান। এটি Enum এর চেয়ে বেশি ফ্লেক্সিবল, কারণ এটি ভিন্ন ধরনের সাবক্লাস রাখতে পারে এবং প্রত্যেক সাবক্লাস আলাদা আলাদা ডেটা ধারণ করতে পারে।
১. Sealed Class কীভাবে ডিফাইন করা হয়?
Sealed ক্লাস ডিফাইন করতে sealed কীওয়ার্ড ব্যবহার করা হয়। সাধারণত একটি Sealed ক্লাস অ্যাবস্ট্রাক্ট হিসেবে ডিফাইন করা হয় এবং এর সমস্ত সাবক্লাস একই ফাইলের ভেতরে থাকতে হবে।
উদাহরণ:
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
ব্যাখ্যা:
Resultহলো একটিsealedক্লাস যা তিনটি সাবক্লাসের মাধ্যমে বিভিন্ন অবস্থা উপস্থাপন করে:Success: সফল অবস্থার জন্য একটি ডেটা ক্লাস।Error: ত্রুটির জন্য একটি ডেটা ক্লাস।Loading: একটি অবজেক্ট যা লোডিং অবস্থাকে উপস্থাপন করে।
২. Sealed Classes এর ব্যবহার
Sealed ক্লাসগুলো সাধারণত when স্টেটমেন্টের সাথে ব্যবহার করা হয়, কারণ এটি সমস্ত সম্ভাব্য সাবক্লাস চেক করে এবং Exhaustive Checking নিশ্চিত করে।
উদাহরণ:
fun handleResult(result: Result) {
when (result) {
is Success -> println("Data received: ${result.data}")
is Error -> println("Error: ${result.message}")
Loading -> println("Loading...")
}
}
fun main() {
val success = Success("Data loaded successfully!")
val error = Error("Something went wrong")
val loading = Loading
handleResult(success) // আউটপুট: Data received: Data loaded successfully!
handleResult(error) // আউটপুট: Error: Something went wrong
handleResult(loading) // আউটপুট: Loading...
}
ব্যাখ্যা:
handleResultফাংশনটি একটিResultটাইপের ইনপুট নেয় এবংwhenস্টেটমেন্ট ব্যবহার করে সঠিক সাবক্লাস অনুযায়ী এক্সিকিউট করে।whenস্টেটমেন্টে Sealed ক্লাসের প্রতিটি সাবক্লাস কভার করা হয়েছে, ফলে এটি সম্পূর্ণ (exhaustive)।
৩. কেন Sealed Class ব্যবহার করবেন?
- Type Safety: Sealed ক্লাস ব্যবহার করে নির্দিষ্ট টাইপের সাবক্লাসের একটি সীমাবদ্ধ সেট তৈরি করা যায়।
- Exhaustive Checking:
whenস্টেটমেন্টে Sealed ক্লাস ব্যবহার করলে, কম্পাইলার নিশ্চিত করে যে সমস্ত সাবক্লাস কভার করা হয়েছে। - ফ্লেক্সিবিলিটি: Sealed ক্লাসে ভিন্ন ধরনের এবং বিভিন্ন ধরনের ডেটা রাখা যায়, যা Enum-এ সম্ভব নয়।
৪. Sealed Class এবং Enum এর পার্থক্য
| Sealed Class | Enum Class |
|---|---|
| ভিন্ন ধরনের সাবক্লাস রাখতে পারে। | শুধুমাত্র নির্দিষ্ট সংখ্যা এবং টাইপের মান ধারণ করতে পারে। |
| সাবক্লাসগুলো আলাদা আলাদা ডেটা রাখতে পারে। | প্রতিটি কনস্ট্যান্ট সাধারণত একই ধরনের থাকে। |
when স্টেটমেন্টে Exhaustive Checking নিশ্চিত করা যায়। | একই কাজ করা যায়, কিন্তু ভিন্ন ডেটা ধারণ করা যায় না। |
৫. Nested Sealed Class
কটলিনে একটি Sealed ক্লাসের ভেতরে আরও Sealed ক্লাস রাখা যায়। এটি হায়ারার্কি তৈরির ক্ষেত্রে অনেক সুবিধা দেয়।
উদাহরণ:
sealed class Vehicle {
data class Car(val brand: String) : Vehicle()
data class Bike(val brand: String) : Vehicle()
sealed class Electric : Vehicle() {
data class Tesla(val model: String) : Electric()
data class Nissan(val model: String) : Electric()
}
}
ব্যাখ্যা:
- এখানে
Vehicleএকটি Sealed ক্লাস যাCar,Bike, এবংElectricনামে সাবক্লাস ধারণ করে। Electricনিজেও একটি Sealed ক্লাস এবং এর আরও দুটি সাবক্লাস রয়েছে:TeslaএবংNissan।
৬. Sealed Interface
কটলিন ১.৫ থেকে Sealed Interface সাপোর্ট করা হয়েছে। এটি Sealed ক্লাসের মতোই কাজ করে, তবে ইন্টারফেস হিসেবে ব্যবহৃত হয়।
উদাহরণ:
sealed interface PaymentStatus
data class Success(val transactionId: String) : PaymentStatus
data class Failure(val error: String) : PaymentStatus
object Pending : PaymentStatus
ব্যাখ্যা:
- এখানে
PaymentStatusএকটি Sealed ইন্টারফেস, এবং এর বিভিন্ন ইমপ্লিমেন্টেশন রয়েছে:Success,Failure, এবংPending। - Sealed ইন্টারফেস একই ফাইলের ভেতর সমস্ত ইমপ্লিমেন্টেশন নিশ্চিত করে।
উপসংহার
কটলিনে Sealed Classes এবং Sealed Interfaces ব্যবহার করলে আপনি নির্দিষ্ট সাবক্লাসের একটি স্থির সেট তৈরি করতে পারেন, যা টাইপ সেফটি নিশ্চিত করে এবং কম্পাইল টাইমে ভ্যালিডেশন করতে সক্ষম। এটি when স্টেটমেন্টের সাথে খুবই কার্যকর, কারণ এটি সমস্ত সম্ভাব্য কেস কভার করা নিশ্চিত করে। Sealed ক্লাস ব্যবহার করলে আপনার প্রোগ্রামিং আরও ফ্লেক্সিবল এবং সুরক্ষিত হয়।
Read more