النوع التعدادي هو نوع بيانات خاص يسمح للمتغير بأن يأخذ واحدة من مجموعة ثوابت محددة مسبقًا.
يجب أن تكون قيمة المتغير مساوية لإحدى القيم المحددة مسبقًا له.
من الأمثلة الشائعة اتجاهات البوصلة (القيم NORTH وSOUTH وEAST وWEST) وأيام الأسبوع.
ولأنها ثوابت، فإن أسماء حقول النوع التعدادي تُكتب بأحرف كبيرة.
في لغة برمجة Java، تُعرّف نوعًا تعداديًا باستخدام الكلمة المفتاحية enum.
على سبيل المثال، تُحدّد نوعًا تعداديًا لأيام الأسبوع هكذا:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
يُستحسن استخدام الأنواع التعدادية كلما احتجت إلى تمثيل مجموعة ثابتة من الثوابت. يشمل ذلك الأنواع التعدادية الطبيعية مثل كواكب مجموعتنا الشمسية، ومجموعات البيانات التي تعرف فيها كل القيم الممكنة وقت الترجمة، مثل الخيارات في قائمة، أو أعلام سطر الأوامر، وما إلى ذلك.
إليك كودًا يوضح لك كيفية استخدام التعداد DayOfWeek المعرّف أعلاه:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
الأنواع التعدادية في لغة برمجة Java أقوى بكثير من نظيراتها في لغات أخرى.
تعريف enum يعرّف صنفًا (يُسمى نوعًا تعداديًا).
يمكن أن يحتوي جسم الصنف التعدادي على طرق وحقول أخرى:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
استدعاء الطريقة getNumberOfStars على عضو من النوع التعدادي Rating:
Rating.GOOD.getNumberOfStars();
// => 4
في هذا التمرين ستتعامل مع سطور السجل.
كل سطر سجل هو سلسلة نصية منسّقة كالتالي: "[<LVL>]: <MESSAGE>".
هذه هي مستويات السجل المختلفة:
TRC (trace)DBG (debug)INF (info)WRN (warning)ERR (error)FTL (fatal)لديك ثلاث مهام.
عرّف تعداد LogLevel يحتوي على ستة عناصر تقابل مستويات السجل المذكورة أعلاه.
TRACEDEBUGINFOWARNINGERRORFATALبعد ذلك، نفّذ الطريقة LogLine.getLogLevel() التي تُرجع مستوى السجل المُحلَّل لسطر السجل:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
لسوء الحظ، تحمل بعض سطور السجل أحيانًا مستوى سجل غير معروف.
للتعامل مع هذه السطور بسلاسة، أضف عنصر UNKNOWN إلى تعداد LogLevel، والذي ينبغي إرجاعه عند تحليل مستوى سجل غير معروف:
var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN
مستوى السجل في سطر السجل مطوّل نوعًا ما.
لتقليل مساحة القرص اللازمة لتخزين سطور السجل، طُوّرت صيغة مختصرة: "[<ENCODED_LEVEL>]:<MESSAGE>".
مستوى السجل المشفَّر هو ربط بسيط بين مستوى السجل وعدد:
UNKNOWN - 0
TRACE - 1
DEBUG - 2
INFO - 4
WARNING - 5
ERROR - 6
FATAL - 42
نفّذ الطريقة LogLine.getOutputForShortLog() التي تستطيع إخراج صيغة سطر السجل المختصرة:
var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
سجّل في Exercism لتتعلّم وتتقن Java عبر 26 مفهومًا158 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.