کلاس های enum در کاتلین

کلاس های enum در کاتلین

توضیحات

از کلاس های enum برای نگهداری تعداد متناهی از آبجکت های ثابت استفاده می کنیم.

معمولا enum رو زمانی تعریف میکنیم که تو برنامه چندتا وضعیت مشخص داریم.

هرکدوم از آبجکت هایی که داخل این کلاس ها ایجاد می کنیم گویای وضعیت بخصوصی در برنامه یا قسمتی از برنامه هستند و تمام وضعیت های موجود مورد نظر رو داخل کلاس enum به صورت آبجکت های ثابت بیان می کنیم.

فرم کلی این کلاس ها به صورت زیر است

enum class Status{ Object0, Object1, Object2, ... , ObjectN; }

در بالا Object0 تا ObjectN داخل Status نمونه ای از کلاس Status هستند.

بررسی و ویژگی کلاس های enum

همینطور که گفتیم بعد از تعریف کلاس enum میتونیم یک یا چند آبجکت ثابت داخلش تعریف کنیم و هرکدوم گویای وضعیت خاصی از برنامه میتونن باشن.

مقادیر آبجکت ها ثابت و غیرقابل تغییر هستند برای همین بهشون آبجکت های ثابت کلاس enum میگیم.

در زیر یک کلاس enum ایجاد کردیم و سه آبجکت داخلش تعریف کردیم برای داشتن سه وضعیت خاموش، روشن و استندبای

fun main(){ println(PowerStatus.STANDBY) println(PowerStatus.ON) println(PowerStatus.OFF) } enum class PowerStatus{ ON, OFF, STANDBY }

کلاس enum به طور پیشفرض دارای پراپرتی entries است این پراپرتی از نوع EnumEntries است و مانند آرایه یا لیست تمام آبجکت های تعریف شده برای enum رو نگهداری میکنه:

fun main(){ val entries = PowerStatus.entries for(status in entries) println(status) } enum class PowerStatus{ ON, OFF, STANDBY }

توجه

در کلاس های enum یک تابع پیشفرض نیز وجود داره به اسم values، این تابع کاربرد مشابه پراپرتی entries داره اما استفاده ازش توصیه نمیشه چون با هر بار صدا زدن تابع یک نمونه ی جدید از کلاس arrays ایجاد میشه و این کار کیفیت برنامه رو پایین میاره.

با تابع valueOf(String) کلاس enum میتونیم آبجکت مورد نظر رو بر اساس اسمش پیدا کنیم:

fun main(){ println(PowerStatus.valueOf("ON") }

توجه

در صورت نبود آبجکت هم نام با استرینگ تابع valueOf برنامه دچار illegalArgumentException میشه.

آبجکت های enum به طور پیشفرض دارای دو پراپرتی name و ordinary هستند

پراپرتی name اسم آبجکت رو به صورت String بر میگردونه و پراپرتی ordinary شماره جایگاه آبجکت در کلاس رو به صورت integer

fun main(){ var currentStatus = PowerStatus.STANDBY println(currentStatus.name) println(currentStatus.ordinary) } enum class PowerStatus{ ON, OFF, STANDBY }

در کانستراکتور کلاس های enum میتونیم مثل بقیه ی کلاس ها پراپرتی تعریف کنیم، این پراپرتی ها باید هنگام تعریف آبجکت های ثابت مقداردهی بشن

fun main(){ var currentStatus = PowerStatus.ON when(currentStatus.statusCode){ 0 -> println("The device is off") 1 -> println("The device is in standby mode") 2 -> println("The device is on") } } enum class PowerStatus(val statusCode: Int){ ON(2), OFF(0), STANDBY(1) }

داخل کلاس های enum میتونیم تابع و پراپرتی های ابسترکت نیز تعریف کنیم:

fun main() { var currentDevicePowerStatus = PowerStatus.OFF println("The current power status is: ${currentDevicePowerStatus.name}") val input = Scanner(System.`in`) val result: String if (currentDevicePowerStatus.statusCode == PowerStatus.OFF.statusCode) { println("Do u wanna turn the device on? (yes/no)") result = input.next() if (result == "yes") { println("Turning device on") currentDevicePowerStatus = currentDevicePowerStatus.updateStatus(PowerStatus.ON.statusCode) } } println("The current power status is: ${currentDevicePowerStatus.name}") } enum class PowerStatus(val statusCode: Int){ ON(2){ override fun updateStatus(statusCode: Int): PowerStatus { return when(statusCode) { 0 -> OFF 1 -> STANDBY else -> ON } } }, OFF(0){ override fun updateStatus(statusCode: Int): PowerStatus { return when(statusCode){ 2 -> ON else -> OFF } } }, STANDBY(1){ override fun updateStatus(statusCode: Int): PowerStatus { return when(statusCode){ 2 -> ON else -> STANDBY } } }; abstract fun updateStatus(statusCode: Int): PowerStatus }

میتونیم اینترفیس ها رو داخل کلاس enum پیاده‌سازی کنیم و کلاس های enum به طور پیشفرض اینترفیس Comparable<T> رو پیاده‌سازی کردن.

نکته

نمیتونیم از کلاس های دیگه توسط کلاس enum ارث ببریم.

خلاصه

- کلاس های enum مجموعه ی متناهی از آبجکت های ثابت هستند.

از این کلاس ها برای تعیین کردن وضعیت به خصوصی در برنامه استفاده میکنیم.

برای هر وضعیت یک آبجکت تعریف میکنیم.

میتونیم اینترفیس ها رو در کلاس enum پیاده‌سازی کنیم

نمیتونیم از کلاس های دیگه توسط کلاس enum ارث ببریم.

arrow_drop_up
کپی شد!