Действительно ли возможно расширить Перечисления Java?

Вот то, что я надеюсь выполнять, у меня есть класс, который имеет перечисление некоторых значений, и я хочу разделить это на подклассы и добавить больше значений к перечислению. Это - плохой пример, но:

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. Цифра содержит все Шестнадцатеричные Цифры. Это возможно?

20
задан Nicolai 12 October 2011 в 05:39
поделиться

3 ответа

Нет, это невозможно. Лучшее, что вы можете сделать, это реализовать два перечисления и интерфейс, а затем использовать этот интерфейс вместо перечисления. Итак:

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;
  }
}
35
ответ дан 29 November 2019 в 23:44
поделиться

Нет, вы не можете. Если вы посмотрите на определение Enum, его экземпляры окончательны и не могут быть расширены. Это имеет смысл, если вы понимаете перечисления как конечный, final набор значений.

Существует разница между числовым числом (синтаксическим артефактом), которое может быть двоичным, десятичным, шестнадцатеричным или любым другим, и фактическим семантическим числом, числовым объектом, синтаксически представленным числом в контексте ( базовая система.)

В вашем примере вам нужны

  • перечисления, определяющие синтаксические числа (десятичные цифры и буквенные символы, представляющие допустимые {{1 }} шестнадцатеричные числа; то есть токены перечисления, и
  • классы, определяющие поведение (или грамматику), необходимое для синтаксического представления числа как числа (с использованием числовых [синтаксических] перечислений).

То есть у вас есть токены или символы и грамматика / поведение, которые указывают, представляет ли поток токенов число с заданным основанием.

Но это немного не по касательной (и, как вы сказали, это был просто пример для примера). Возвращаясь к расширению перечислений ...

... вы не можете и не должны. Перечисления не предназначены представлять вещи, которые могут быть расширенный.Они предназначены для представления констант набора постоянных значений . Есть такие вещи, которые не передаются по наследству.

Кроме того, не попадайтесь в ловушку расширения ради расширения или попытки навязать структуру в вашем коде или модели.

Может показаться, что имеет смысл сделать один набор ценностей продолжением другого. Чаще всего это не так. Используйте наследование для повторного использования поведения или сложной структуры, а не только данных, которые практически не имеют структуры и связаны с поведением, не допускающим повторного использования.

4
ответ дан 29 November 2019 в 23:44
поделиться

Нет.

Перечисления не могут быть подклассами.

Причина в том, что перечисление определяет фиксированное число значений. Подклассификация нарушит это.

6
ответ дан 29 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: