sealed class ও sealed interface Kotlin-এ সীমাবদ্ধ টাইপ শ্রেণিবিন্যাসের প্রক্রিয়া, যেখানে সব সম্ভাব্য উপশ্রেণি কম্পাইল টাইমে জানা যায়। সাধারণ অ্যাবস্ট্রাক্ট ক্লাসের বিপরীতে, sealed class when-এক্সপ্রেশনে সব ভেরিয়েন্টের সম্পূর্ণ হ্যান্ডলিং নিশ্চিত করে। JetBrains Kotlin Language Guide (2026) ডকুমেন্টেশন অনুযায়ী, sealed টাইপগুলি Kotlin প্রকল্পে অবস্থা, UI স্ক্রিন এবং ফলাফল টাইপ মডেলিংয়ের ভিত্তি।
মূল বিষয়
sealed class হল একটি অ্যাবস্ট্রাক্ট ক্লাস যার একটি সীমাবদ্ধতা রয়েছে: এর সব সরাসরি উপশ্রেণি অবশ্যই sealed class-এর মতো একই ফাইলে ঘোষণা করতে হবে। এই সীমাবদ্ধতা শ্রেণিবিন্যাসকে বন্ধ (sealed) করে — ফাইলের বাইরের কোনো কোড নতুন উপশ্রেণি যোগ করতে পারে না।
sealed interface, Kotlin 1.5-এ যোগ করা হয়েছে, একই গ্যারান্টি প্রদান করে কিন্তু ইন্টারফেসের নমনীয়তার সাথে: একটি sealed interface একাধিক ক্লাস, অবজেক্ট বা অন্যান্য ইন্টারফেস দ্বারা এক ফাইলে বাস্তবায়িত হতে পারে। sealed class-এর বিপরীতে, sealed interface-এ একক উত্তরাধিকারের কোনো সীমাবদ্ধতা নেই — একটি ক্লাস একসাথে একাধিক sealed ইন্টারফেস বাস্তবায়ন করতে পারে।
Kotlin Evolution and Roadmap (2026) অনুযায়ী, sealed interface আরও নমনীয় মডেলিংয়ের জন্য সম্প্রদায়ের অনুরোধে যোগ করা হয়েছিল। মূল প্রেরণা ছিল একাধিক ক্লাস উত্তরাধিকার ছাড়াই স্বাধীন টাইপ শ্রেণিবিন্যাসগুলিকে একত্রিত করার ক্ষমতা।
sealed class-এর ঘোষণা class-এর আগে sealed মডিফায়ার দিয়ে শুরু হয়। উপশ্রেণিগুলি একই ফাইলে ঘোষণা করা হয়।
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
sealed class-এর প্রতিটি উপশ্রেণির নিজস্ব বৈশিষ্ট্য ও পদ্ধতি থাকতে পারে। Loading একটি সিঙ্গলটন (object), Success ও Error প্যারামিটারসহ data class। কম্পাইলার তিনটি ভেরিয়েন্টই জানে এবং when-এ ব্যবহারের সময় তাদের সম্পূর্ণতা যাচাই করে।
sealed ক্লাসগুলি নেস্টেড হতে পারে, টাইপ সেফটি না হারিয়ে জটিল ডেটা মডেলের জন্য বহু-স্তরের শ্রেণিবিন্যাস তৈরি করে।
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
sealed interface sealed class-এর মতোই ঘোষণা করা হয়, কিন্তু একটি ক্লাসে একাধিক sealed ইন্টারফেস বাস্তবায়নের অনুমতি দেয়।
sealed interface Action
sealed interface Loggable
data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable
Navigate ক্লাস একসাথে দুটি sealed ইন্টারফেস — Action ও Loggable — বাস্তবায়ন করে। এটি sealed class-এর সাথে একক উত্তরাধিকার সীমাবদ্ধতার কারণে অসম্ভব। sealed interface স্বাধীন শ্রেণিবিন্যাস একত্রিত করার নমনীয়তা প্রদান করে।
sealed interface তখনই পছন্দনীয় যখন শ্রেণিবিন্যাসের ভাগ করা অবস্থা বা কনস্ট্রাক্টরের প্রয়োজন নেই। JetBrains Kotlin Guidelines (2026) অনুযায়ী, যেখানে সাধারণ কনস্ট্রাক্টরের প্রয়োজন নেই সেখানে সব নতুন শ্রেণিবিন্যাসের জন্য ডিফল্টভাবে sealed interface ব্যবহার করা উচিত, যা ভবিষ্যতের সম্প্রসারণের জন্য কোডকে আরও নমনীয় করে।
sealed টাইপের প্রধান সুবিধা হল when-এক্সপ্রেশনে সম্পূর্ণ (exhaustive) হ্যান্ডলিং। কম্পাইলার যাচাই করে যে সব সম্ভাব্য উপশ্রেণি অন্তর্ভুক্ত হয়েছে।
fun handleResult(result: NetworkResult): String = when (result) {
is NetworkResult.Success -> "Data: ${result.data}"
is NetworkResult.Error -> "Error: ${result.message}"
is NetworkResult.Loading -> "Loading..."
// else প্রয়োজন নেই — কম্পাইলার জানে সব ভেরিয়েন্ট কভার করা হয়েছে
}
যদি কোনো ডেভেলপার sealed শ্রেণিবিন্যাসে নতুন উপশ্রেণি যোগ করে কিন্তু when-এ তা হ্যান্ডল করতে ভুলে যায় — কম্পাইলার ত্রুটি দেখাবে। এটি টাইপ স্তরে নিরাপত্তা, যা else-শাখা ব্যবহারকারী খোলা শ্রেণিবিন্যাসে উপলব্ধ নয়।
Google Android Developers (2026) অনুযায়ী, sealed ক্লাসগুলি Jetpack Compose-এ UI অবস্থা মডেল করার প্রস্তাবিত উপায়। when-এর সম্পূর্ণতা যাচাই সেই অবস্থাগুলি প্রতিরোধ করে যেখানে ডেভেলপার স্ক্রিনের সব সম্ভাব্য প্রদর্শন ভেরিয়েন্ট হ্যান্ডল করেনি।
enum class ও sealed class প্রায়শই বিভ্রান্ত হয়, কিন্তু তাদের বিভিন্ন উদ্দেশ্য ও ক্ষমতা রয়েছে।
| বৈশিষ্ট্য | sealed class | enum class |
|---|---|---|
| উদাহরণ | একাধিক (data class), একটি (object) | প্রতি ধ্রুবকের জন্য ঠিক একটি |
| বৈশিষ্ট্য | প্রত্যেক উপশ্রেণির জন্য আলাদা | সব ধ্রুবকের জন্য একই |
| উত্তরাধিকার | হ্যাঁ (sealed class থেকে) | না (অন্তর্নিহিত final) |
| কনস্ট্রাক্টর | প্যারামিটার থাকতে পারে | শুধু সব ধ্রুবকের জন্য ভাগ করা |
| শ্রেণিবিন্যাস | সীমাবদ্ধ, sealed | ধ্রুবকের নির্দিষ্ট সেট |
sealed class ও enum class-এর মধ্যে নির্বাচন কাজের উপর নির্ভর করে। যদি ভেরিয়েন্টগুলি অতিরিক্ত ডেটা বহন না করে — enum ব্যবহার করুন। যদি প্রতিটি ভেরিয়েন্টে অনন্য ফিল্ড থাকে — sealed class বা sealed interface ব্যবহার করুন।
sealed টাইপগুলি Kotlin প্রকল্পে বেশ কিছু মানক পরিস্থিতির জন্য ব্যবহৃত হয় যেখানে type-safe মডেলিং প্রয়োজন।
প্রতিটি Compose স্ক্রিনে একটি sealed class UiState থাকতে পারে যা সব সম্ভাব্য অবস্থা বর্ণনা করে: Idle, Loading, Content(data), Error(exception)। when এক্সপ্রেশন গ্যারান্টি দেয় যে সব অবস্থা হ্যান্ডল করা হয়েছে।
NetworkResult Success, Error, Loading ভেরিয়েন্টসহ Retrofit ও Ktor ব্যবহারকারী Kotlin প্রকল্পে একটি মানক প্যাটার্ন। sealed class প্রতিটি অনুরোধের ফলাফলের নিরাপদ হ্যান্ডলিং নিশ্চিত করে।
sealed interface নেভিগেশন রুটের জন্য মডিউলগুলিকে একটি সমন্বিত শ্রেণিবিন্যাসের মধ্যে থেকে নিজস্ব রুট ঘোষণা করার অনুমতি দেয়। এটি কম্পাইল টাইমে অজানা রুটের ত্রুটিগুলি দূর করে।
KotlinConf (2025) অনুযায়ী, sealed class ও sealed interface আধুনিক Kotlin অ্যাপ্লিকেশনে type-safe ডিজাইনের ভিত্তি। এগুলি data class-এর সাথে মিলিত হয়ে কম্পাইল টাইমে নিরাপত্তা না হারিয়ে জটিল ডোমেন কাঠামো মডেল করে।
সাধারণ জিজ্ঞাসা
sealed class-এর সব সরাসরি উপশ্রেণি একই ফাইলে ঘোষণা করতে হবে। sealed interface-এর জন্যও একই নিয়ম — বাস্তবায়ন এক ফাইলে।
না, এক ফাইলের নিয়ম sealed interface-এর জন্যও প্রযোজ্য। সব বাস্তবায়ন sealed interface যেখানে ঘোষণা করা হয়েছে সেই ফাইলে থাকতে হবে।
sealed interface-এর কোনো অবস্থা বা কনস্ট্রাক্টর নেই এবং একাধিক বাস্তবায়নের অনুমতি দেয়। sealed class-এ কনস্ট্রাক্টর ও ভাগ করা অবস্থা থাকতে পারে, কিন্তু একটি ক্লাস শুধুমাত্র একটি sealed class উত্তরাধিকার করতে পারে।
কম্পাইলার when-এর সম্পূর্ণতা যাচাই করে: যদি সব উপশ্রেণি হ্যান্ডল না করা হয়, কোড কম্পাইল হয় না। এটি রানটাইম ত্রুটিগুলি দূর করে এবং কোডকে নিরাপদ করে।
হ্যাঁ, একটি sealed class-এর কনস্ট্রাক্টর থাকতে পারে (ডিফল্টভাবে private)। সব উপশ্রেণি super()-এর মাধ্যমে এই কনস্ট্রাক্টরে প্যারামিটার পাস করতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন