Kotlin

Bridge To Kotlin Part 8 (Enum Classes & Sealed Classes)

အရင်အပိုင်းတွေ လေ့လာချင်တယ်ဆိုရင်

Enum Classes

ကျွန်တော်တို့ အနေနဲ့ ရှေ့ဆက်ပြီး enum classes တွေ အကြောင်း လေ့လာရအောင် ပုံမှန်အတိုင်းတော့ ကျွန်တော်တို့ သုံးနေကြအတိုင်း enum classes တွေကို ရေးလို့ရပါတယ်။ ဒါပေမယ့် Kotlin မှာ enum တွေနဲ့ ပတ်သက်ပြီး ထူးခြားတာလေးတွေ ရှိပါတယ်။ အရင်ထက်ပိုပြီး လုပ်ဆောင်နိုင်တာလေးတွေ ရှိတယ်ဆိုတဲ့ သဘောပါ။ အထူးသဖြင့် နောက်တစ်ခန်းမှာ ပြောမယ့် Sealed Classes နဲ့ တွဲလိုက်မယ်ဆိုရင် Java မှာ မရနိုင်တာတွေ ကျွန်တော်တို့ ရလာနိုင်ပါတယ်။ ကျွန်တော်တို့ eum class တွေကို ဥပမာရေးကြည့်ရအောင်

ကျွန်တော်တို့ နမူနာကို လေ့လာကြည့်မယ်ဆိုရင် enum ကို အလွယ်တကူ လေ့လာနိုင်ပါတယ်။

Sealed Classes

Sealed Classes တွေကတော့ ကျွန်တော်တို့ Java မှာ မရနိုင်ပဲ Kotlin မှာသာ ရနိုင်တဲ့ classes တွေ ဖြစ်ပါတယ်။ Kotlin ဟာ Functional Programming ပုံစံတွေထဲက concept အများအပြားကို ထည့်သွင်းထားတဲ့အတွက် ပါဝင်လာတဲ့ feature တစ်ခု ဖြစ်ပါတယ်။ Sealed classes တွေဟာ abstract class တွေ ဖြစ်တာနဲ့အညီ တိုက်ရိုက် အသုံးပြုလို့ မရနိုင်ပါဘူး။ Sealed Class ကို နားလည်နိုင်ဖို့ တစ်ဆင့်ခြင်းစီ ရှင်းပြသွားပါမယ်။

အပေါ်မှာ ရေးထားတဲ့ ကုဒ်ကို လေ့လာကြည့်မယ်ဆိုရင် else ဆိုတာကို မဖြစ်မနေ ထည့်ဖို့ လိုအပ်နေပါတယ်။ ဘာကြောင့်လဲဆိုတော့ open class Mammal မှာ Dog လဲ ဖြစ်နိုင်သလို Fish လဲ ဖြစ်နိုင်နေလို့ပါ။ အဲဒီနေရာမှာ ဒီလိုပြောင်းရေးလိုက်ရင်တော့ Human and Cat က လွဲလို့ ဘာမှ မရှိနိုင်တော့ပါဘူး။

open class ကို sealed class လို့ ပြောင်းလိုက်မယ်ဆိုရင် when ကို သုံးတဲ့အခါ else ကို ထည့်စရာ မလိုတော့ပါဘူး။ mammal တွေမှာ Human နဲ့ Cat က လွဲလို့ ဘာမှ မရှိနိုင်တော့လို့ပါ။ ဒါကတော့ အရိုးရှင်းဆုံး ဥပမာ ဖြစ်ပါတယ်။

ကျွန်တော် enum class တွေတုန်းက sealed class တွေနဲ့ တွဲပြီး သိဖို့ လိုတယ်လို့ ပြောခဲ့ပါတယ်။ enum class တွေနဲ့ sealed class တွေက ရည်ရွယ်ချက် တူနေတာ သတိထားမိပါလိမ့်မယ်။ ဒါပေမယ့် sealed class တွေက enum class တွေထက် သာတာတွေ ရှိပါတယ်။ အဲဒါတွေကို လေ့လာကြည့်ရအောင်

အပေါ်မှာ ရေးထားတာက ရိုးရိုး enum class ကို သုံးပြီး ရေးထားတာ ဖြစ်ပါတယ်။ ကျွန်တော်တို့ BasicScreenState ကို စစ်လို့ရလာပါတယ်။ ရှေ့ဆက်ပြီး enum data passing ပုံစံ သုံးပြီး ရေးကြည့်ရအောင်

အဲဒီ code block ကို လေ့လာကြည့်မယ်ဆိုရင် enum ကို အသုံးပြုထားတဲ့အတွက် ပုံစံတူဖို့ လိုနေပါတယ်။ တကယ်တန်း လိုအပ်တာက DATA မှာသာ SomeData က လိုအပ်တာပါ။ ကျန်တဲ့နေရာမှာ မလိုပါဘူး။ အဲဒီလို အခြေအနေအတွက် enum class တွေက သုံးလို့ မရတော့ပါဘူး။  အဲဒီနေရာက စပြီး enum classes တွေနဲ့ sealed classes တွေရဲ့ ကွာခြားချက်ကို တွေ့နိုင်ပါတယ်။  

တကယ်တော့ enum ဆိုတာ အဲဒီလို ပုံစံ Data Passing လုပ်လို့ရတယ်ဆိုပေမယ့် ဒီထက် ရိုးရှင်းတဲ့ ပုံစံတွေမှာသာ အသုံးပြုဖို့ သင့်တော်ပါတယ်။

အဲဒီလို အခြေအနေတွေအတွက် sealed class က အများကြီး ကူညီပေးနိုင်ပါတယ်။ Sealed Class နဲ့ ပတ်သက်ပြီး ကုဒ်တွေ မရေးခင်မှာ မှတ်သားရမယ့် အချက်လေးတွေကို အရင်ပြောရအောင်

  • Sealed classes တွေဟာ ကန့်သတ်ထားတဲ့ class ထက်အောက် အစီအစဉ်တွေကို ကိုယ်စားပြုဖို့ သုံးပါတယ်။
  • တကယ်တော့ sealed classes တွေဟာ enum classes တွေကို extension တွေပဲ ဖြစ်ပါတယ်။
  • Sealed Classes တွေမှာ subclasses တွေ ရှိနိုင်ပါတယ်။ ဒါပေမယ့် အဲဒါတွေကို တစ်ဖိုင်တည်းမှာ ပေါင်းပြီး ကြော်ငြာပေးရပါမယ်။ ဖိုင်ကွဲသွားလို့ မရပါဘူး။
  • Sealed class တစ်ခုရဲ့ subclasses တွေတိုင်းမှာ တစ်ခုထက် ပိုတဲ့ instance တွေ ရှိနိုင်ပါတယ်။ instnace တိုင်းမှာ state တွေ ပါဝင်ခွင့်ရှိပါတယ်။
  • Sealed Class တစ်ခုရဲ့ subclasses တွေကို sealed class အတွင်းမှာဖြစ်ဖြစ် အပြင်မှာ ဖြစ်ဖြစ် ကြော်ငြာလို့ရပါတယ်။ ဒါပေမယ့် တစ်ဖိုင်တည်း ဖြစ်ဖို့ လိုပါတယ်။
  • Seal Classes တွေဟာ Abstract Class တွေ ဖြစ်ပါတယ်။
  • Sealed Classes တွေမှာ non-private constructor တွေ သုံးလို့မရပါဘူး။ မူရင်းကိုယ်တိုင်က private ဖြစ်ပါတယ်။

ကဲ ကျွန်တော်တို့ အပေါ်မှာ ရေးခဲ့တဲ့ code ကို sealed class နဲ့ ပြောင်းရေးကြည့်ရအောင်

Sealed class နဲ့ when ကို ပေါင်းလိုက်တဲ့ အချိန်မှာ သိပ်ကို လှပတဲ့ ကုဒ်ရေးသားမှု ပုံစံတွေ ရလာပါတယ်။ ဒီလောက်ဆိုရင် Sealed Class အကြောင်းကို နားလည်ပြီး ထင်ပါတယ်။

ဒီနေရာမှာ တစ်ချက် သတိထားဖို့ လိုတာကက Action speak louder than words ဆိုတဲ့အတိုင်း Android Development အပိုင်းမှာ Sealed Classes တွေကို သုံးဖြစ်ဖို့ ကြိုးစားဖို့ လိုဦးမှာ ဖြစ်ပါတယ်။ Android ကို Java နဲ့ ရေးနေကြသူတွေအတွက် သမာရိုးကျ အရေးအသားကနေ ဖောက်ထွက်မှသာ Sealed Classes တွေ သုံးဖြစ်ပါလိမ့်မယ်။

ဆက်ပါဦးမယ်