Oct 11, 2007 22:41
Считается, что от классов перечислений в Java нельзя наследоваться. На самом деле, это не совсем так. Элемент перечисления может являться объектом класса перечисления, как обычно это происходит. Но может быть и прямым наследником этого класса. Продемонстрирую на примере.
public class EnumInheritanceTest {
enum Operator {
PLUS {
public int calculate(int lhs, int rhs) {
return lhs + rhs;
}
},
MINUS {
public int calculate(int lhs, int rhs) {
return lhs - rhs;
}
},
MULTIPLICATION {
public int calculate(int lhs, int rhs) {
return lhs * rhs;
}
};
public abstract int calculate(int lhs, int rhs);
}
public static void main(String[] args) {
System.out.println("Plus: " + Operator.PLUS.calculate(7, 3));
System.out.println("Minus: " + Operator.MINUS.calculate(7, 3));
System.out.println("Multiply: " + Operator.MULTIPLICATION.calculate(7, 3));
}
}
System.out:
Plus: 10
Minus: 4
Multiply: 21
Я объявил в классе перечисления абстрактный метод и определили его в элементах перечисления -- наследниках класса Operator.
После объявление элемента перечисления в фигурных скобках можно определять поля и методы. В таком случае для этого элемента будет создан отдельный внутренний класс -- подкласс класса перечисления. Если же секцию с фигурными скобками опустить, то элемент будет класса самого перечисления.
public class EnumClassTester {
enum Avatara {
MATSYA {}, VARAHA
}
public static void main(String[] args) {
System.out.println("Matsya: " + Avatara.MATSYA.getClass());
System.out.println("Varaha: " + Avatara.VARAHA.getClass());
}
}
System.out:
Matsya: class foo.EnumClassTester$Avatara$1
Varaha: class foo.EnumClassTester$Avatara
программирование