Подтвердить что ты не робот

Возможно ли продлить 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 содержит все шестнадцатеричные числа. Возможно ли это?

4b9b3361

Ответ 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...