Элементы перечисления Java с пробелами? - PullRequest
26 голосов
/ 05 декабря 2011

Я работаю над Java, я создал перечисление следующим образом:

public enum myEnum
{
    india,
    russian,
    england,
    north America
}

Приведенный выше пример выдает ошибки при использовании пробела в имени элемента (т. Е. В Северной Америке).Любые предложения, как решить вышеуказанную проблему?

Ответы [ 8 ]

66 голосов
/ 05 декабря 2011

Нельзя ставить пробел в середине идентификатора.

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

Обычные имена значений Java были бы:

INDIA,         // Or  India,
RUSSIA,        //     Russia,
NORTH_AMERICA; //     NorthAmerica;

enum может иметь связанные свойства, такие как читаемые человеком имена,например,

public enum CountryAndOneContinent {

    INDIA("India"),
    RUSSIA("Russia"),
    NORTH_AMERICA("North America");

    private String displayName;

    CountryAndOneContinent(String displayName) {
        this.displayName = displayName;
    }

    public String displayName() { return displayName; }

    // Optionally and/or additionally, toString.
    @Override public String toString() { return displayName; }
}

Я неоднозначно отношусь к использованию toString для представления представлений на уровне представления.

Я предпочитаю, чтобы методы сообщали свое назначение явно - это более выразительно и очевидно.

toString является довольно общим и допускает только одно представление.В зависимости от контекста, параметров и т. Д. Может потребоваться несколько выходных форматов, которые toString не позволяют.

Преимущества toString включают использование строковых операций по умолчанию над объектом и, в этом случае, использование valueOf для прямого перевода из читаемой человеком версии в значение enum.

15 голосов
/ 05 декабря 2011

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

Так сделайте это:

public enum MyEnum {
    INDIA("India"),
    RUSSIAN("Russian"),
    ENGLAND("England"),
    NORTH_AMERICA("North America");    

    private String name;

    MyEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }    
}

Вы можете рассмотреть возможность переопределения строки.

public toString() {
    return name;
}

Преимущество переопределения toString (), эта строка также может использоваться в MyEnum .valueOf (myString).Таким образом, переопределение toString в основном создает HashMap значений перечисления.

5 голосов
/ 05 декабря 2011

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

3 голосов
/ 05 декабря 2011

Напишите их вместе как northAmerica или используйте подчеркивание north_America.

2 голосов
/ 05 декабря 2011

Правило именования Java не допускает использование пробелов в качестве возможных символов в именах переменных, классов, перечислений и членов перечислений (и всех других идентификаторов). Поэтому эта «проблема» не может быть решена. Просто используйте `north_america 'в качестве имени пользователя!

Идентификатор представляет собой последовательность букв Java и Java неограниченной длины. цифры, первая из которых должна быть буквой Java.

Буквы Java включают прописные и строчные латинские буквы ASCII A-Z (\ u0041- \ u005a) и a-z (\ u0061- \ u007a), а для исторических причины, подчеркивание ASCII (_, или \ u005f) и знак доллара ($, или \ U0024). Символ $ должен использоваться только в механически сгенерированном исходный код или, редко, доступ к ранее существующим именам в устаревших системах.

"Цифры Java" включают в себя цифры ASCII 0-9 (\ u0030- \ u0039).

1 голос
/ 27 сентября 2014

просто создайте свою собственную функцию valueOf как в вашем классе enum.Замените пробелы подчеркиванием.Назовите ваши константы перечисления как это "north_america (" Северная Америка ")".Если метод не может найти ваше перечисление, он просто возвращает параметр.

public  static String valueOfOrDefault(String myValue) {
//replace space with underscore so it matches enum name
        String value=myValue.toUpperCase().replaceAll("\\s", "_");
        for(myEnum type : myEnum.class.getEnumConstants()) {
          if(type.name().equalsIgnoreCase(value)) {
            return type.toString();
          }
        }
        return myValue;
      }
1 голос
/ 05 декабря 2011
public enum myEnum
{
    india,
    russian,
    england,
    north_america
}

Для доступа к значениям

myEnum.values()
0 голосов
/ 05 марта 2018

Я также ввел собственный метод valueOf. Но я возвращаюсь с типом Enum и мне не нужно конвертировать "checkString"

checkString, например, "Petty Cash".

JournalType journalType = JournalType.valueOfOrDefault (checkString);

public enum JournalType {

MISC_BILLING("Misc Billing"),
MISC_BILLING_AUTONUM("Misc Billing AutoNum"),
PRETTY_CASH("Petty Cash"),
RECURRING_AP("Recurring AP"),
GL_JOURNAL("GL Journal"),
GDS_NDS("GDS/NDS");

private final String journalType;

JournalType(String journalType) {
    this.journalType = journalType;
}

@Override
public String toString() {
    return journalType;
}

public static JournalType valueOfOrDefault(String myValue) {
    for(JournalType type : JournalType.class.getEnumConstants()) {
        if(type.toString().equals(myValue)) {
            return type;
        }
    }
   throw new IllegalArgumentException("JournalType not found");
}

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