یک نوع شمارشی یک نوع دادهی ویژه است که اجازه میدهد یک متغیر مجموعهای از ثابتهای از پیش تعریفشده باشد.
متغیر باید با یکی از مقادیری که برایش از پیش تعریف شدهاند برابر باشد.
نمونههای رایج شامل جهتهای قطبنما (مقادیر 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 (ردیابی)DBG (debug)INF (اطلاعات)WRN (هشدار)ERR (خطا)FTL (بحرانی)سه وظیفه دارید.
یک enum به اسم LogLevel تعریف کنید که شش عنصر متناظر با سطوح لاگ بالا دارد.
TRACEDEBUGINFOWARNINGERRORFATALسپس متد LogLine.getLogLevel() را پیادهسازی کنید که سطح لاگ تجزیهشدهی یک خط لاگ را برمیگرداند:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
متأسفانه گاهی بعضی خطوط لاگ یک سطح لاگ ناشناخته دارند.
برای اینکه با این خطوط لاگ بهشکل مناسبی رفتار کنید، یک عنصر UNKNOWN به enum 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"