النوع التعدادي هو نوع بيانات خاص يسمح للمتغير بأن يكون إحدى مجموعة من الثوابت المعرَّفة مسبقًا.
ويجب أن تكون قيمة المتغير مساوية لإحدى القيم المعرَّفة مسبقًا له.
من الأمثلة الشائعة اتجاهات البوصلة (القيم 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
يضيف المترجم تلقائيًا بعض الطرق الخاصة عند إنشاء تعداد.
على سبيل المثال، تمتلك طريقة values الساكنة التي تُرجع مصفوفة تحتوي على كل قيم التعداد بالترتيب الذي عُرّفت به:
for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
System.out.println(dayOfWeek.toString());
}
سيطبع المقتطف أعلاه ما يلي:
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
ويضيف المترجم أيضًا طريقة valueOf الساكنة التي تُرجع عضوًا من التعداد بناءً على اسمه:
DayOfWeek.valueOf("SUNDAY");
// => DayOfWeek.SUNDAY