Вот то, что я надеюсь выполнять, у меня есть класс, который имеет перечисление некоторых значений, и я хочу разделить это на подклассы и добавить больше значений к перечислению. Это - плохой пример, но:
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. Цифра содержит все Шестнадцатеричные Цифры. Это возможно?
Нет, это невозможно. Лучшее, что вы можете сделать, это реализовать два перечисления и интерфейс, а затем использовать этот интерфейс вместо перечисления. Итак:
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;
}
}
Нет, вы не можете. Если вы посмотрите на определение Enum, его экземпляры окончательны и не могут быть расширены. Это имеет смысл, если вы понимаете перечисления как конечный, final набор значений.
Существует разница между числовым числом (синтаксическим артефактом), которое может быть двоичным, десятичным, шестнадцатеричным или любым другим, и фактическим семантическим числом, числовым объектом, синтаксически представленным числом в контексте ( базовая система.)
В вашем примере вам нужны
То есть у вас есть токены или символы и грамматика / поведение, которые указывают, представляет ли поток токенов число с заданным основанием.
Но это немного не по касательной (и, как вы сказали, это был просто пример для примера). Возвращаясь к расширению перечислений ...
... вы не можете и не должны. Перечисления не предназначены представлять вещи, которые могут быть расширенный.Они предназначены для представления констант набора постоянных значений . Есть такие вещи, которые не передаются по наследству.
Кроме того, не попадайтесь в ловушку расширения ради расширения или попытки навязать структуру в вашем коде или модели.
Может показаться, что имеет смысл сделать один набор ценностей продолжением другого. Чаще всего это не так. Используйте наследование для повторного использования поведения или сложной структуры, а не только данных, которые практически не имеют структуры и связаны с поведением, не допускающим повторного использования.
Нет.
Перечисления не могут быть подклассами.
Причина в том, что перечисление определяет фиксированное число значений. Подклассификация нарушит это.