перечислимые значения, содержащие пробелы - PullRequest
0 голосов
/ 05 мая 2019
enum Commands
{
    ADDPLAYER, REMOVEPLAYER, EDITPLAYER, RESETSTATS,
    DISPLAYPLAYER, RANKINGS, STARTGAME, EXIT
};

Итак, у меня есть следующие команды для игры.Теперь мне необходимо ввести команды «ранжирование asc» и «ранжирование desc», то есть указание ранжирования в порядке возрастания или убывания, а не просто ранжирования.Я не уверен, как это сделать.Я попытался добавить "RANKINGS ASC" / DESC в список команд enum, но это не работает из-за пробела.Команда должна иметь пробел между двумя терминами при вызове в программе, которая называется в точности как «ranks asc».Другие команды будут использоваться в обычном режиме (используются в случаях).Есть идеи?Может ли команда ранжирования иметь аргументы?

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Способ разделения слов в именах констант не является пробелом: , который недопустим для идентификаторов, но подчеркивание: _, то есть:

RANKINGS_ASC, RANKINGS_DESC  

Это верно для значений перечисления, таких какдля final static имен констант поля.

Команде необходимо указывать пробел между двумя терминами при вызове в программе, который называется в точности как «ranks asc».

Значения перечисления являются постоянными значениями типа компиляции.Они представляют логическое имя перечисления, они не предназначены для точного представления текстовых значений, введенных клиентами приложения.В некоторых случаях они могут, но не могут в некоторых других случаях, и это приемлемо.
Чтобы выполнить ваше требование, вы можете определить перечисление с помощью конструктора параметров, где параметр представляет текстовые команды, введенные клиентом.
Но теперь, если для этих двух случаев требуется единственное сопоставление, просто замените пробел подчеркиванием и используйте Enum.valueOf(String), чтобы получить перечисление, например:

Command command = Commands.valueOf(clientCommand.replace(" ", "_"))

Обратите внимание, что вы можете добавить параметр дляконструктор emum, как показано в Babyburger (miam), но он имеет смысл только в том случае, если параметр имеет смысл для всех значений enum, потому что вы хотите управлять им единообразно.Если это не так, вам, вероятно, не следует использовать этот способ.

1 голос
/ 13 июня 2019

В качестве альтернативы для ответа @ davidxxx , если вы хотите, чтобы клиентский код не обрабатывал преобразование между именем enum и его строковым представлением, вы можете переместить код внутрь тип enum:

public enum Commands {

    RANKINGS_ASC, RANKINGS_DESC;

    @Override
    public String toString() {
        return name().replaceAll("_", " ");
    }  
}
0 голосов
/ 05 мая 2019

В именах перечислений не должно быть пробелов. Но вы можете добавить аргументы в перечисления:

enum Commands
{
    ADDPLAYER("addplayer"), REMOVEPLAYER("removeplayer"), RANKINGS_ASC("rankings asc"), RANKINGS_DESC("rankings desc")

    private String name;

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

    public String getName(){
        return this.name;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...