Можно ли избежать ":" двоеточия в enum? - PullRequest
0 голосов
/ 18 января 2012

Есть ли обходной путь, чтобы можно было использовать двоеточия в качестве ключа в перечислениях?

public enum foo {
   _DEFAULT_GET("com.foo.my.package");   // works fine
   _PREFIX_GET("com.foo.my.other.package");
   _PRE:CODE_GET("com.foo.yet.another.package");  // <-- how do I escape this colon?
}

РЕДАКТИРОВАТЬ: прежде чем я буду забыт, я хотел бы добавитьпроизошло изменение соглашения об именах, которое было вынесено.Это вызвало довольно веселые дебаты в команде!: -)

Ответы [ 5 ]

7 голосов
/ 18 января 2012

Нет, : не является допустимым символом в идентификаторе Java.

Допустимые символы: a-z A-Z, 0-9, (the {unicode letters}), _ и $

Вы пытаетесь сделать то же самое, что и

private String he:llo; // not valid since : is a language construct, used in places such as labels

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

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

Как упоминал @ Kevin.K, a-zA-Z на самом деле является буквенным кодом Unicode.

4 голосов
/ 18 января 2012

Согласно спецификации языка Java каждое значение перечисления должно быть идентификатором :

EnumConstant:

Аргументы идентификаторов аннотаций opt ClassBody opt

и идентификаторы не могут содержать двоеточие (:) внутри. Так что нет, вы не можете избежать этого.

1 голос
/ 18 января 2012

Правила для идентификаторов (так называемые «имена») в Java не допускают встраивание в идентификатор определенных «специальных» символов, таких как двоеточие (:) или точка с запятой (;).

Вы можете прочитать об этом здесь.

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

1 голос
/ 18 января 2012

Вы не можете.В качестве имени вы можете использовать строку, содержащую буквы алфавита, цифры или подчеркивание (_) или доллар ($)А также обратите внимание, что имя не может начинаться с цифры.Только с буквой алфавита, подчеркиванием или долларом.

0 голосов
/ 18 января 2012

Странное требование. Это невозможно, поскольку свойства перечисления являются просто синтаксическим сахаром над переменными-членами класса, а имена переменных не могут быть экранированы. Однако вы можете переопределить метод toString. Печь имеет собственный конструктор и геттер / сеттер для дополнительных свойств.

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