Enum (شمارششده) نوعی کلاس است که تمام نمونههای آن از قبل برای کامپایلر شناختهشده هستند. Enumها برای ایجاد انواع دادهای استفاده میشوند که فقط تعداد محدودی مقدار ممکن دارند.
Enumها مشابه کلاسها ساخته میشوند اما به جای کلمهٔ کلیدی class از enum استفاده میکنند. در بدنه، لیستی از نمونههای Enum به نام Enum Constants وجود دارد که با کاما (,) جدا شدهاند. خارج از Enum Constants نمیتوان نمونهٔ دیگری ایجاد کرد.
public enum DayOfWeek {
// Enum Constants اینجا لیست شدهاند:
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
تمام Enumها بهطور ضمنی از java.lang.Extend ارث میبرند و نمیتوانند زیرکلاس نامگذاریشده داشته باشند.
مقادیر Enum را میتوان بهعنوان ثابت استفاده کرد. برای بررسی اینکه آیا دو نمونه از Enum یکسان هستند، از عملگر == استفاده میشود:
DayOfWeek weekStart = DayOfWeek.MONDAY;
if (weekStart == DayOfWeek.MONDAY) {
IO.println("The week starts on Monday.");
}
میتوان بر اساس مقدار Enum با استفاده از switch عملیات مختلفی انجام داد:
DayOfWeek someDay = DayOfWeek.FRIDAY;
switch (someDay) {
case MONDAY ->
IO.println("The week just started.");
case TUESDAY, WEDNESDAY, THURSDAY ->
IO.println("We are somewhere in the middle of the week.");
case FRIDAY ->
IO.println("The weekend is near.");
case SATURDAY, SUNDAY ->
IO.println("Weekend");
default ->
throw new AssertionError("Should not happen");
}
با Switch Expressionها، کامپایلر بررسی میکند که آیا تمام مقادیر Enum پوشش داده شدهاند. اگر مقداری جا افتاده باشد، خطای کامپایل رخ میدهد. به این قابلیت Exhaustiveness (جامعیت) گفته میشود.
DayOfWeek someDay = DayOfWeek.FRIDAY;
String text = switch (someDay) {
case MONDAY -> "The week just started.";
case TUESDAY, WEDNESDAY, THURSDAY -> "We are somewhere in the middle of the week.";
case FRIDAY -> "The weekend is near.";
case SATURDAY, SUNDAY -> "Weekend";
};
IO.println(text);
---
مانند کلاسها، Enumها میتوانند Constructor، Method و فیلد داشته باشند. برای اضافهکردن این اجزا، پس از لیست Enum Constants باید یک نقطهٔویرگول (;) قرار دهید. آرگومانهای Constructor در پرانتز پس از اعلامیهٔ Enum Constant ارسال میشوند:
public enum DayOfWeek {
MONDAY("MON"), TUESDAY("TUE"), WEDNESDAY("WED"),
THURSDAY("THU"), FRIDAY("FRI"), SATURDAY("SAT"), SUNDAY("SUN");
private final String abbreviation;
DayOfWeek(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
}
---
تمام Enumها چند Method بهصورت ضمنی اضافهشده دارند:
در تمام نمونههای Enum وجود دارد و نام Enum Constant را برمیگرداند:
IO.println(DayOfWeek.MONDAY.name()); // "MONDAY" چاپ میکند
موقعیت Enum Constant در اعلامیه را برمیگرداند:
IO.println(DayOfWeek.MONDAY.ordinal()); // "0" چاپ میکند چون MONDAY اولین Constant در DayOfWeek است
آرایهای شامل تمام نمونههای Enum برمیگرداند:
DayOfWeek[] days = DayOfWeek.values(); // تمام روزهای هفته
نمونهٔ خاصی را بر اساس نامش برمیگرداند:
DayOfWeek monday = DayOfWeek.valueOf("MONDAY");
Enumها Interface Comparable را پیادهسازی میکنند. بهطور پیشفرض، Enumها بر اساس شمارهٔ Ordinal خود مرتب میشوند — یعنی ترتیب ظاهرشان در اعلامیه. این قابلیت مقایسه، مرتبسازی و جستجوی نمونههای Enum را فراهم میکند.
public void compareDayOfWeek(DayOfWeek dayOfWeek) {
int comparison = dayOfWeek.compareTo(DayOfWeek.WEDNESDAY);
if (comparison < 0) {
IO.println("It's before the middle of the work week.");
} else if (comparison > 0) {
IO.println("It's after the middle of the work week.");
} else {
IO.println("It's the middle of the work week.");
}
}
List<DayOfWeek> days = new ArrayList<>(List.of(DayOfWeek.FRIDAY, DayOfWeek.TUESDAY, DayOfWeek.SATURDAY));
Collections.sort(days);
---
چون Enumها فقط تعداد محدودی نمونه میتوانند داشته باشند، میتوان با ایجاد Enum با فقط یک Constant یک Singleton ساخت:
public enum SomeSingleton {
INSTANCE;
// فیلدها، Methodها و...
}
---
اگرچه Enumها قابل ارثبردن (Extend) نیستند، میتوانند Methodهای abstract داشته باشند. در این صورت، پیادهسازی باید در هر Enum Constant بهصورت جداگانه ارائه شود:
enum MyEnum {
A() {
@Override
void doSomething() {
IO.println("a");
}
},
B() {
@Override
void doSomething() {
IO.println("b");
}
};
abstract void doSomething();
}
---
هنگام استفاده از Enum در مواردی که تعداد (یا نامهای) نمونهها ممکن است تغییر کند، باید احتیاط کرد. هرگاه Enum Constants تغییر کنند، کدی که نسخهٔ قبلی Enum را انتظار دارد ممکن است به درستی کار نکند.
این مشکل میتواند به اشکال مختلف ظاهر شود:
default case در حالی که Enum Constant جدید باید جداگانه مدیریت شودتوصیه: هنگام تغییر Enum Constants، تمام کدهای استفادهکننده از Enum را بررسی کنید. بهویژه در مواردی که Enum توسط کدهای افراد دیگر نیز استفاده میشود.
همچنین اگر Enum تعداد زیادی نمونه دارد، ممکن است استفاده از گزینههای دیگر مثل فایل پیکربندی بهتر باشد، چون فهرستکردن تعداد زیادی نمونه در یک نقطه از کد میتواند انعطافناپذیر باشد.
---Enumها راهی ساده و ایمن برای نمایش مجموعهای ثابت از مقادیر ارائه میدهند و در عین حال بیشتر انعطافپذیریهای کلاسها را حفظ میکنند. Enum نوعی ویژه از کلاس است که برای نوشتن کدی شیوا، خوانا، قابل نگهداری و سازگار با ویژگیهای مدرن جاوا مثل Switch Expressionها مناسب است.
برای اطلاعات بیشتر دربارهٔ Enum، جاوا داک java.lang.Enum را مراجعه کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/