Возможно ли продлить Java Enums?
Здесь, что я хочу выполнить, у меня есть класс, который имеет перечисление некоторых значений, и я хочу подклассировать это и добавить больше значений в перечисление. Это плохой пример, но:
public class Digits
{
public enum Digit
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
}
}
public class HexDigits extends Digits
{
public enum Digit
{
A, B, C, D, E, F
}
}
так что HexDigits.Digit содержит все шестнадцатеричные числа. Возможно ли это?
Ответы
Ответ 1
Нет, это невозможно. Лучшее, что вы можете сделать, это сделать два перечисления и интерфейс, а затем использовать этот интерфейс вместо enum. Итак:
interface Digit {
int getValue();
}
enum Decimal implements Digit {
ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE;
private final int value;
Decimal() {
value = ordinal();
}
@Override
public int getValue() {
return value;
}
}
enum Hex implements Digit {
A, B, C, D, E, F;
private final int value;
Hex() {
value = 10 + ordinal();
}
@Override
public int getValue() {
return value;
}
}
Ответ 2
Нет.
Перечисления не могут быть подклассы.
Обоснование здесь состоит в том, что перечисление определяет фиксированное количество значений.
Подклассификация нарушит это.
Ответ 3
Нет, вы не можете. Если вы посмотрите на определение Enum, его экземпляры являются окончательными и не могут быть расширены. Это имеет смысл, если вы понимаете перечисления как конечный конечный набор значений.
Существует разница между цифрой (синтаксическим артефактом), которая может быть двоичной, десятичной, шестнадцатеричной или любой другой, и фактическим семантическим числом, числовым сущностью, представленным синтаксически цифрой в контексте (базовая система.)
В вашем примере вам нужно
- перечисления, определяющие синтаксические цифры
(десятичные цифры и алфавитные
символы, представляющие юридические
шестнадцатиричном; то есть перечисляемые токены,
и
- классы, определяющие поведение (или
грамматика), требуемая для синтаксических
представляя число в виде цифры
(используя цифру [синтаксис]
перечисления).
То есть у вас есть маркеры или символы и грамматика/поведение, указывающие, представляет ли поток токенов число под данной базой.
Но это немного от касательной (и, как вы сказали, это был просто пример, например, сакэ). Возвращаясь к расширению перечислений...
... yo не может, и вы не должны. Перечисления не предназначены для представления вещей, которые могут быть расширены. Они предназначены для представления константы набора постоянных значений. Есть такие вещи, которые не наследуются.
Кроме того, не попадайте в ловушку расширения ради расширения или для попыток заставить структуру в свой код или модель.
Возможно, имеет смысл сделать один набор значений расширением другого. Чаще всего это не так. Используйте наследование для повторного использования поведения или сложной структуры, а не только данных, у которых практически нет структуры с неприменимым к ней поведением.
Ответ 4
Это невозможно. И есть причина. Представьте, что вы могли бы расширить перечисление:
enum A { ONE, TWO }
enum B extends A { THREE } // for a total { ONE, TWO, THREE }
Теперь вы можете сделать это:
B b = B.THREE
A a = b // a = B.THREE ?
Но B.THREE
не является допустимым параметром для A
.
Конечно, вы можете сделать их не-полиморфными, но тогда это не распространяется.
Ответ 5
согласны с тем, что перечисление не предназначено для расширения... но при столкновении с Tapestry 5 выберите компонент... и версия перечисления это лучшая версия.... по сравнению с (смехотворно?) сложными объектными моделями примеры там... могли видеть, как расширение и перечисление привлекательны для этого случая....
btw (seque gripe), что, черт возьми, это отбрасывание гобелена, а не построение/лучшая практика jsp-рамки? в лучшем случае это создает подразделение развития ui, которое оставляет java-технологии слабее для опыта imho...