枚举适用于具有一组固定值的概念。枚举的一个很好的例子是一年中的月份。在公历中,有十二个月,您可以这样创建一个月份枚举:
enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}
您可以赋予个别成员特定的行为,例如,我们可以提供numberOfDays 属性:
enum Month {
JANUARY(31), FEBRUARY(28), MARCH(31), APRIL(30), MAY(31), JUNE(30),
JULY(31), AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31);
private final int numberOfDays;
Month(int numberOfDays) {
this.numberOfDays = numberOfDays;
}
public int getNumberOfDays() {
return numberOfDays;
}
}
但是,您会注意到,二月并非每年都有 28 天。相反,你需要给它更多的特殊行为。因此,您可以为 FEBRUARY 创建一个类体来执行此操作:
enum Month {
JANUARY(31),
FEBRUARY(28) {
@Override
public int getNumberOfDays(int year) {
return isLeapYear(year) ? 29 : 28;
}
private boolean isLeapYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
},
MARCH(31), APRIL(30), MAY(31), JUNE(30), JULY(31),
AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31);
private final int numberOfDays;
Month(int numberOfDays) {
this.numberOfDays = numberOfDays;
}
public int getNumberOfDays(int year) {
return numberOfDays;
}
}