перечисления являются оружием выбора при работе с конечным набором значений того же типа. Например:
public enum Month {
JANUARY,
FEBRUARY,
MARCH,
APRIL,
... etc
}
Это делает их использование строго типизированными .
Вы можете указать методы для принятия enum в качестве параметров, например:
private Month month;
public void setMonth(Month month) {
this.month = month;
}
Альтернативой является использование констант String (или int), часто называемых строковым типом , но такие константы не являются типизированными - методы, принимающие Strings, будут принимать any String - например, "Foo «:
private String month;
public void setMonth(String month) {
this.month = month; // Will accept "Foo"
}
enum может использоваться (в основном) как обычные классы - у вас могут быть конструкторы (private), поля и методы, например:
public enum Month {
JANUARY("January",
FEBRUARY("February",
...
DECEMBER("December");
private final name;
private Month(String name) { // Constructors must be private
this.name = name;
}
public String getName() {
return name;
}
}
Вы даже можете иметь сеттеры, потому что перечисления не обязательно должны быть неизменяемыми (их поля не должны быть окончательными), но это не рекомендуется.
РЕДАКТИРОВАНИЕ: Подробнее
перечисления не могут extends
, но могут implements
, поэтому, если у вас было несколько типов Месяцев (для разных Календарей), вы можете сделать это, чтобы сохранить строгую типизацию. Вот и пример абстракции календаря и месяца
interface Month {
}
enum GregorianMonth implements Month {
}
enum ChineseMonth implements Month {
}
abstract class Calendar<T extends Enum<T> & Month> { // T must be both an enum and a Month
T month;
void setMonth(T month) {
this.month = month;
}
}
class GregorianCalendar extends Calendar<GregorianMonth> {
}
class ChineseCalendar extends Calendar<ChineseMonth> {
}