Kotlin-এ sealed class ও interface — এটি কী, সিনট্যাক্স ও ব্যবহার

লেখক: IT Sectr প্রকাশিত: 2026-06-20 পড়ার সময়: 11 মিনিট

sealed class ও sealed interface Kotlin-এ সীমাবদ্ধ টাইপ শ্রেণিবিন্যাসের প্রক্রিয়া, যেখানে সব সম্ভাব্য উপশ্রেণি কম্পাইল টাইমে জানা যায়। সাধারণ অ্যাবস্ট্রাক্ট ক্লাসের বিপরীতে, sealed class when-এক্সপ্রেশনে সব ভেরিয়েন্টের সম্পূর্ণ হ্যান্ডলিং নিশ্চিত করে। JetBrains Kotlin Language Guide (2026) ডকুমেন্টেশন অনুযায়ী, sealed টাইপগুলি Kotlin প্রকল্পে অবস্থা, UI স্ক্রিন এবং ফলাফল টাইপ মডেলিংয়ের ভিত্তি।

মূল বিষয়

  • sealed — সীমাবদ্ধ শ্রেণিবিন্যাস যেখানে সব উপশ্রেণি কম্পাইল টাইমে জানা যায়
  • when — বাধ্যতামূলক else-ব্লক ছাড়াই সব উপশ্রেণির সম্পূর্ণ হ্যান্ডলিং
  • sealed interface — Kotlin 1.5-এ নমনীয় শ্রেণিবিন্যাসের জন্য উত্তরাধিকার সীমাবদ্ধতা ছাড়াই যোগ করা হয়েছে
  • কম্পাইলেশন — sealed টাইপের জন্য অসম্পূর্ণ when-এ কম্পাইলেশন ত্রুটি
  • শ্রেণিবিন্যাস — সব উপশ্রেণি একই ফাইলে বা sealed ক্লাসের ভিতরে থাকতে হবে

sealed class ও sealed interface কী?

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-এর সিনট্যাক্স

sealed class-এর ঘোষণা class-এর আগে sealed মডিফায়ার দিয়ে শুরু হয়। উপশ্রেণিগুলি একই ফাইলে ঘোষণা করা হয়।

kotlin
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 ক্লাসগুলি নেস্টেড হতে পারে, টাইপ সেফটি না হারিয়ে জটিল ডেটা মডেলের জন্য বহু-স্তরের শ্রেণিবিন্যাস তৈরি করে।

kotlin
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-এর সিনট্যাক্স (Kotlin 1.5+)

sealed interface sealed class-এর মতোই ঘোষণা করা হয়, কিন্তু একটি ক্লাসে একাধিক sealed ইন্টারফেস বাস্তবায়নের অনুমতি দেয়।

kotlin
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 class-এর পরিবর্তে sealed interface বেছে নেবেন

sealed interface তখনই পছন্দনীয় যখন শ্রেণিবিন্যাসের ভাগ করা অবস্থা বা কনস্ট্রাক্টরের প্রয়োজন নেই। JetBrains Kotlin Guidelines (2026) অনুযায়ী, যেখানে সাধারণ কনস্ট্রাক্টরের প্রয়োজন নেই সেখানে সব নতুন শ্রেণিবিন্যাসের জন্য ডিফল্টভাবে sealed interface ব্যবহার করা উচিত, যা ভবিষ্যতের সম্প্রসারণের জন্য কোডকে আরও নমনীয় করে।

when-এ সম্পূর্ণ হ্যান্ডলিং

sealed টাইপের প্রধান সুবিধা হল when-এক্সপ্রেশনে সম্পূর্ণ (exhaustive) হ্যান্ডলিং। কম্পাইলার যাচাই করে যে সব সম্ভাব্য উপশ্রেণি অন্তর্ভুক্ত হয়েছে।

kotlin
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-এর সম্পূর্ণতা যাচাই সেই অবস্থাগুলি প্রতিরোধ করে যেখানে ডেভেলপার স্ক্রিনের সব সম্ভাব্য প্রদর্শন ভেরিয়েন্ট হ্যান্ডল করেনি।

sealed class বনাম enum class তুলনা

enum class ও sealed class প্রায়শই বিভ্রান্ত হয়, কিন্তু তাদের বিভিন্ন উদ্দেশ্য ও ক্ষমতা রয়েছে।

বৈশিষ্ট্যsealed classenum class
উদাহরণএকাধিক (data class), একটি (object)প্রতি ধ্রুবকের জন্য ঠিক একটি
বৈশিষ্ট্যপ্রত্যেক উপশ্রেণির জন্য আলাদাসব ধ্রুবকের জন্য একই
উত্তরাধিকারহ্যাঁ (sealed class থেকে)না (অন্তর্নিহিত final)
কনস্ট্রাক্টরপ্যারামিটার থাকতে পারেশুধু সব ধ্রুবকের জন্য ভাগ করা
শ্রেণিবিন্যাসসীমাবদ্ধ, sealedধ্রুবকের নির্দিষ্ট সেট

sealed class ও enum class-এর মধ্যে নির্বাচন কাজের উপর নির্ভর করে। যদি ভেরিয়েন্টগুলি অতিরিক্ত ডেটা বহন না করে — enum ব্যবহার করুন। যদি প্রতিটি ভেরিয়েন্টে অনন্য ফিল্ড থাকে — sealed class বা sealed interface ব্যবহার করুন।

ব্যবহারিক পরিস্থিতি

sealed টাইপগুলি Kotlin প্রকল্পে বেশ কিছু মানক পরিস্থিতির জন্য ব্যবহৃত হয় যেখানে type-safe মডেলিং প্রয়োজন।

Jetpack Compose-এ UI অবস্থা

প্রতিটি 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 class-এর সব সরাসরি উপশ্রেণি একই ফাইলে ঘোষণা করতে হবে। sealed interface-এর জন্যও একই নিয়ম — বাস্তবায়ন এক ফাইলে।

sealed interface কি ভিন্ন ফাইলে বাস্তবায়ন থাকতে পারে?

না, এক ফাইলের নিয়ম sealed interface-এর জন্যও প্রযোজ্য। সব বাস্তবায়ন sealed interface যেখানে ঘোষণা করা হয়েছে সেই ফাইলে থাকতে হবে।

sealed class ও sealed interface-এর মধ্যে পার্থক্য কী?

sealed interface-এর কোনো অবস্থা বা কনস্ট্রাক্টর নেই এবং একাধিক বাস্তবায়নের অনুমতি দেয়। sealed class-এ কনস্ট্রাক্টর ও ভাগ করা অবস্থা থাকতে পারে, কিন্তু একটি ক্লাস শুধুমাত্র একটি sealed class উত্তরাধিকার করতে পারে।

sealed ক্লাসগুলি when-এক্সপ্রেশনে কীভাবে সাহায্য করে?

কম্পাইলার when-এর সম্পূর্ণতা যাচাই করে: যদি সব উপশ্রেণি হ্যান্ডল না করা হয়, কোড কম্পাইল হয় না। এটি রানটাইম ত্রুটিগুলি দূর করে এবং কোডকে নিরাপদ করে।

sealed class-এর কি কনস্ট্রাক্টর থাকতে পারে?

হ্যাঁ, একটি sealed class-এর কনস্ট্রাক্টর থাকতে পারে (ডিফল্টভাবে private)। সব উপশ্রেণি super()-এর মাধ্যমে এই কনস্ট্রাক্টরে প্যারামিটার পাস করতে পারে।

সারসংক্ষেপ

  • sealed class — কম্পাইল টাইমে জানা উপশ্রেণি সহ সীমাবদ্ধ শ্রেণিবিন্যাস
  • sealed interface — একাধিক বাস্তবায়ন সমর্থন সহ নমনীয় বিকল্প (Kotlin 1.5+)
  • when — কম্পাইলার যাচাই সহ সম্পূর্ণ হ্যান্ডলিং, else প্রয়োজন নেই
  • এক ফাইল — সব উপশ্রেণি ও বাস্তবায়ন sealed টাইপের ফাইলে থাকতে হবে
  • মডেলিং — UI অবস্থা, নেটওয়ার্ক ফলাফল, নেভিগেশন, ইভেন্ট সিস্টেম
  • নিরাপত্তা — when হ্যান্ডলিং ছাড়া নতুন উপশ্রেণি যোগ করলে কম্পাইলেশন ত্রুটি
  • নির্বাচন — ডিফল্টভাবে sealed interface পছন্দনীয়, sealed class যখন ভাগ করা অবস্থা প্রয়োজন

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন