В 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
очень похож на шаблон Typesafe Enum.
Другие известные мне отличия:
- перечисления автоматически предоставляют метод
values()
- перечисления могут использоваться в
switch()
(и компилятор даже проверяет, не забыли ли вы значение)
Но все это выглядит не более чем синтаксическим сахаром, даже с некоторыми добавленными ограничениями (например, enum
всегда наследуется от java.lang.Enum
и не может быть разделен на подклассы).
Есть ли другие, более фундаментальные преимущества, которые дает enum
, которые нельзя реализовать с помощью шаблона Typesafe Enum?
case
в своем переключателе, и он может предупредить, если не все значения перечисления охвачены случаями. И да, часто вместо переключателя лучше использовать полиморфизм, но это зависит от обстоятельств. - person sleske   schedule 19.06.2012