الفرق بين المراجعتين لصفحة: «Kotlin/enum classes»
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:أصناف الثوابت المُتعدِّدة (Enum Classes) في لغة Kotlin}}</noinclude> يتلخَّصُ الاستخدام الرئي...' |
طلا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:أصناف الثوابت المُتعدِّدة (Enum Classes) في لغة Kotlin}}</noinclude> | <noinclude>{{DISPLAYTITLE:أصناف الثوابت المُتعدِّدة (Enum Classes) في لغة Kotlin}}</noinclude> | ||
يتلخَّصُ الاستخدام الرئيسيّ لأصناف الثوابت المتعدَّدة في قدرتها على تعريف الاستخدام (implementing) للثوابت المتعدًّدة الحافظة للنوع (type-safe)، | يتلخَّصُ الاستخدام الرئيسيّ لأصناف الثوابت المتعدَّدة في قدرتها على تعريف الاستخدام (implementing) للثوابت المتعدًّدة الحافظة للنوع (type-safe)، ويُصرَّح عنها بالشكل:<syntaxhighlight lang="kotlin"> | ||
enum class Direction { | enum class Direction { | ||
NORTH, SOUTH, WEST, EAST | NORTH, SOUTH, WEST, EAST | ||
سطر 7: | سطر 7: | ||
== التهيئة (Initialization) == | == التهيئة (Initialization) == | ||
لمّا كان كلّ ثابتٍ في صنف الثوابت المتعدِّدة (enum) يُعدُّ كائنًا فيمكن إجراء التهيئة كما يلي:<syntaxhighlight lang="kotlin"> | |||
enum class Color(val rgb: Int) { | enum class Color(val rgb: Int) { | ||
RED(0xFF0000), | RED(0xFF0000), | ||
سطر 31: | سطر 31: | ||
== التعامل مع الثوابت المتعدِّدة (Enum) == | == التعامل مع الثوابت المتعدِّدة (Enum) == | ||
تحتوي أصناف الثوابت المتعدِّدة (enum) في Kotlin على توابع تركيبية (synthetic methods) -كما هو في Java- مما يسمح بتعداد الثوابت المُتعدِّدة والوصول إلى أيّ ثابتٍ منها عبر اسمه، وتكون ترويسة هذه التوابع كما يلي | تحتوي أصناف الثوابت المتعدِّدة (enum) في Kotlin على توابع تركيبية (synthetic methods) -كما هو في Java- مما يسمح بتعداد الثوابت المُتعدِّدة والوصول إلى أيّ ثابتٍ منها عبر اسمه، وتكون ترويسة هذه التوابع كما يلي (بفرض أنّ اسم صنف الثوابت المتعدِّدة هو <code>EnumClass</code>):<syntaxhighlight lang="kotlin"> | ||
EnumClass.valueOf(value: String): EnumClass | EnumClass.valueOf(value: String): EnumClass | ||
EnumClass.values(): Array<EnumClass> | EnumClass.values(): Array<EnumClass> |
المراجعة الحالية بتاريخ 15:16، 12 مارس 2018
يتلخَّصُ الاستخدام الرئيسيّ لأصناف الثوابت المتعدَّدة في قدرتها على تعريف الاستخدام (implementing) للثوابت المتعدًّدة الحافظة للنوع (type-safe)، ويُصرَّح عنها بالشكل:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
إذ يُعدُّ كلُّ ثابتٍ فيها كائنًا (object)، ويُفصل فيما بينها بالفاصلة ,
.
التهيئة (Initialization)
لمّا كان كلّ ثابتٍ في صنف الثوابت المتعدِّدة (enum) يُعدُّ كائنًا فيمكن إجراء التهيئة كما يلي:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
الأصناف المجهولة (Anonymous Classes)
يُتاح لأيّ ثابتٍ معرَّفٍ في صنف الثوابت المتعدِّدة (enum class) تعريفُ الأصناف المجهولة الخاصّة به، مثل الشيفرة الآتية:
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
إذ يحتوي كلُّ صنفٍ مجهولٍ منها على التوابع المُوافقة وإعادة تعريفٍ (override) للتوابع الأساسيّة، وإذا احتوى صنف الثوابت المتعدِّدة (enum) على أيّة عناصر (members) أخرى فيجب الفصل ما بين تعريف الثوابت بأجمعها وتعريف العناصر الأخرى في الصنف بفاصلةٍ منقوطةٍ ;
كما هو الحال في Java، ولا يمكن أن تحتوي أصناف الثوابت المتعدِّدة على أي عناصر داخلها إلا الأصناف الداخليّة (inner classes) وهذا بحدِّ ذاته مُستبعد في الإصدار Kotlin 1.2.
التعامل مع الثوابت المتعدِّدة (Enum)
تحتوي أصناف الثوابت المتعدِّدة (enum) في Kotlin على توابع تركيبية (synthetic methods) -كما هو في Java- مما يسمح بتعداد الثوابت المُتعدِّدة والوصول إلى أيّ ثابتٍ منها عبر اسمه، وتكون ترويسة هذه التوابع كما يلي (بفرض أنّ اسم صنف الثوابت المتعدِّدة هو EnumClass
):
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
إذ إنّ التابع valueOf()
سيعطي استثناءً من النوع IllegalArgumentException
إذا لم يتوافق الاسم المُحدَّد مع أيّ من أسماء الثوابت المعرًّفة في الصنف.
وأُتيح بدءًا من الإصدار Kotlin 1.1 الوصول إلى الثوابت المتعدَّدة في صنفها (enum) بطريقة مُعمَّمة (generic) بالاعتماد على الدالتين enumValues<T>()
و enumValueOf<T>()
، كما في الشيفرة الآتية:
enum class RGB { RED, GREEN, BLUE }
inline fun <reified T : Enum<T>> printAllValues() {
print(enumValues<T>().joinToString { it.name })
}
printAllValues<RGB>() // ستظهر العبارة RED, GREEN, BLUE
ويحتوي كلّ من هذه الثوابت على خاصّيّاتٍ (properties) للحصول على اسمه وترتيبه ضمن تعريف الصنف، وهي بالشكل:
val name: String
val ordinal: Int
وتحتوي الثوابت أيضًا على تعريف استخدام (implementation) الواجهة Comparable
وبالترتيب الذي رُتِّبَت فيه في صنف الثوابت المتعدِّدة (enum).