شم

شمارشی در Java

12 تمرین

درباره‌ی شمارشی

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

شمارشی را یاد بگیرید