Как использовать java.lang.Enum - PullRequest
3 голосов
/ 07 декабря 2009

Это не вопрос новых функций в enum. Это не вопрос, который ждет ответа, который говорит enum эквивалентен классу xyz extends Enum. Если вы хотите проповедовать о том, как используются перечисления, как показано в многочисленных руководствах, не отвечайте.

Этот вопрос конкретно о том, как использовать класс java.lang.Enum. Скорее это правда, что java.lang.Enum не может быть напрямую расширен или создан, верно? Это правда, что java.lang.Enum предназначен только для типа enum и ничего больше, верно?

Если так, переменные цвета довольно бессмысленны, верно? Хотя компилятор это позволяет.

final static Enum<colors> colours = null;
enum colors {"R","G","B"};

Итак, что я мог бы приравнять к переменным цветам помимо нуля.

конечно, компилятор не позволит мне сделать это

class BaseColour extends Enum<BaseColour>{ ,,,}

но это позволяет перечислить несправедливое преимущество, позволяя сделать это как манипуляцию за кулисами компилятора.

Я задаю этот вопрос, потому что хочу сделать что-то подобное

class Reddish extends BaseColour {"Crimson", "Blood", "Pink"};
class Purplish extends BaseColour {"Violet", "Evening Sky", "Brinjal"};
class Greenish extends BaseColour {"Algae", "Leaf"};

Я хочу передать любой из перечисленных и только перечисленных типов в метод

void squeezeColour(BaseColour colourConstraint)
{ ... }

Возможно ли это? / ** Если нет, и если вы оказались Джеймсом Гослингом и др., Не могли бы вы рассмотреть это для следующей версии спецификаций Java? ** /

Дальнейшее дополнение к вопросу: я забыл сказать это ... То, над чем я работаю, - это использование EnumMap или EnumSet и использование методов содержимого и диапазона. Это лучшее, что я мог сделать?

Ответы [ 3 ]

1 голос
/ 07 декабря 2009

Вы можете просто использовать Словарь, чтобы отобразить абстрактный вид (красноватый) в Enum. Таким образом вы сохраните Enum и сможете сравнить его, используя методы словаря.

1 голос
/ 07 декабря 2009

Если вы хотите сделать это, вам придется сделать это самостоятельно, без использования enum. Если вы воспользуетесь старым шаблоном «en-safe-enum», вы найдете разумный способ.

Это связано с методами в классе Enum, такими как values ​​() и ordinal ().

Если бы вы могли добавлять значения путем расширения, то как они должны заканчиваться в методе values ​​() базового класса. Если вы не хотите использовать их в методе values ​​() базового перечисления, это нарушает правило:

X instanceof MyEnum => MyEnum.values ​​() содержит X

И если Reddish.ordinal () не согласен с BaseColour.ordinal () или согласен. Как это должно работать? Это может быть решено (как демонстрирует материал таблицы диспетчеризации C ++), но оно почти наверняка не стоит усилий.

0 голосов
/ 07 декабря 2009

Внутренним перечислением является целочисленная константа. Или, по крайней мере, JVM может рассматривать это как единое целое именно из-за ограничений, которые вас расстраивают. Это делает перечисления эффективными за счет нарушения ориентации объекта.

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

class Foo {

  // the constants
  public static final Foo RHUBARB = new Foo();
  public static final Foo CUSTARD = new Foo();

  // only this class and subclasses can create constants
  protected Foo(){ }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...