Java. Настоящее наследование от enum.

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

программирование

Previous post Next post
Up