Можно ли расширить перечисления Java? - PullRequest
19 голосов
/ 15 апреля 2010

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

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

Ответы [ 5 ]

34 голосов
/ 15 апреля 2010

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

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;
  }
}
6 голосов
/ 15 апреля 2010

номер

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

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

4 голосов
/ 15 апреля 2010

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

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

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

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

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

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

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

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

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

2 голосов
/ 17 декабря 2017

Это невозможно. И есть причина. Представьте, что вы можете расширить перечисление:

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.

Конечно, вы могли бы сделать их не-полиморфными, но тогда это на самом деле не расширяется.

0 голосов
/ 12 октября 2011

согласен, что перечисления не предназначены для расширения ... но когда они сталкиваются с выбранным компонентом Tapestry 5 ... и его версия перечисления является лучшей версией .... по сравнению с (смешно?) Моделями сложных объектов примеры там ... можно увидеть, насколько расширение и перечисление привлекательны для этого случая ....

btw (seque gripe), какого черта это с выбрасыванием гобелена, а не надстройкой / наилучшей практикой jsp каркаса? в лучшем случае это создает отдел разработки пользовательского интерфейса, который оставляет технологии Java слабее для опыта imho ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...