نوع شمارشی یک نوع دادهی ویژه است که به یک متغیر اجازه میدهد مجموعهای از ثابتهای از پیش تعریفشده باشد.
متغیر باید برابر با یکی از مقادیری باشد که از پیش برایش تعریف شدهاند.
مثالهای رایج شامل جهتهای قطبنما (مقادیر 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