В Java до JDK1.5 паттерн «Typesafe Enum» был обычным способом реализации типа, который может принимать только конечное число значений:
public class Suit {
private final String name;
public static final Suit CLUBS =new Suit("clubs");
public static final Suit DIAMONDS =new Suit("diamonds");
public static final Suit HEARTS =new Suit("hearts");
public static final Suit SPADES =new Suit("spades");
private Suit(String name){
this.name =name;
}
public String toString(){
return name;
}
}
(см., Например, пункт 21 из Эффективная Java * Блоха ).
Теперь в JDK1.5 + "официальным" способом, очевидно, является использование enum
:
public enum Suit {
CLUBS("clubs"), DIAMONDS("diamonds"), HEARTS("hearts"), SPADES("spades");
private final String name;
private Suit(String name) {
this.name = name;
}
}
Очевидно, синтаксиснемного приятнее и лаконичнее (не нужно явно определять поля для значений, подходит toString()
при условии), но пока enum
очень похоже на шаблон Enpes Typesafe.
Другие различия Япомните:
- перечисления автоматически предоставляют
values()
метод - перечисления могут использоваться в
switch()
(и компилятор даже проверяет, что вы не забыли значение)
Но все это выглядит немного больше, чем синтаксический сахар, с добавлением даже нескольких ограничений (например, enum
всегда наследуется от java.lang.Enum
и не может быть разделено на подклассы).
Существуют ли другие, более фундаментальные преимущества, которые enum
предоставляет, которые нельзяealized с помощью шаблона Typesafe Enum?