Возможно ли иметь класс enum с перечислениями из двух или более слов?

Мне нужно выбирать из нескольких типов жанров для книг, и я думал использовать для этого перечисления, но есть несколько жанров, состоящих из двух или более слов, таких как «Медицина, здоровье и фитнес», «Искусство и фотография», «Научная фантастика». , и т.д.

public enum Genero {
    Action, Comedy, Drama, Computers, Novel, Science Fiction
}

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


person Aikanáro    schedule 15.03.2012    source источник


Ответы (3)


Нет, это невозможно. Имена перечислений должны быть действительными идентификаторами Java, то есть без пробелов. Обычное соглашение состоит в том, чтобы объявлять имена перечислений всеми символами верхнего регистра и разделять слова с помощью подчеркивания, например:

public enum Genero {
    ACTION, COMEDY, DRAMA, COMPUTERS, NOVEL, SCIENCE_FICTION
}
person Óscar López    schedule 15.03.2012
comment
Поскольку emums обрабатывается внутри, я думаю, что просто будет использоваться подчеркивание - person Aikanáro; 15.03.2012

Это невозможно. Однако можно использовать в имени знак подчеркивания (Science_Fiction). Вы также можете переопределить метод toString, чтобы он возвращал все, что вы хотите (поскольку кажется, что вы собираетесь использовать удобочитаемое имя для ваших перечислений):

public enum Genero {
    ACTION("Action"), COMEDY("Comedy"), DRAMA("Drama"), COMPUTERS("Computers"), NOVEL("Novel"), SCIENCE_FICTION("Science Fiction");

    private final String toString;

    private Genero(String toString) {
         this.toString = toString;
    }

    public String toString(){
         return toString;
    }
}
person Jeffrey    schedule 15.03.2012
comment
@TomHawtin-tackline Whoopsies, исправлено. - person Jeffrey; 15.03.2012
comment
Я просто хочу присвоить Книге атрибута «Пол» один пол. Например: Gender = Genero.ACTION Я не вижу, где я мог бы использовать конструктор или метод toString: S - person Aikanáro; 15.03.2012
comment
@Aikanáro Вам не нужно создавать свои собственные объекты перечисления; они создаются при загрузке класса. Если вы сделаете это таким образом, переменные, содержащие объекты, будут все заглавными и с символами подчеркивания (поскольку имена переменных не могут иметь пробелов), но если фактические объекты перечисления будут преобразованы в строки, они будут иметь имена в заглавном регистре и пространства. - person Taymon; 15.03.2012
comment
Это хороший пример конструкторов в перечислениях, но поскольку они являются перечислениями, вам определенно следует избавиться от сеттеров. Все поля должны иметь фиксированное значение в перечислении. Однако вы можете сохранить геттеры, чтобы они были доступны в других классах. - person LeonardoSibela; 22.05.2019

Это может быть то, что вы хотите:

static private enum EnumExample { 
  R("Sample emun with spaces"),  
  G("Science Fiction");  
  final private String value; 
  EnumExample(String s) { 
    value = s; 
  } 
} 

System.out.println(EnumExample.G.value); 
System.out.println(EnumExample.valueOf("G").value); 

Science Fiction 
Science Fiction
person Java42    schedule 15.03.2012
comment
Я бы сделал это поле final и private. - person Tom Hawtin - tackline; 15.03.2012
comment
@TomHawtin-tackline Вы имеете в виду окончательное значение частной строки или? - person Java42; 15.03.2012
comment
Да. В настоящее время вы можете написать EnumExample.G.value = "Comedy";. - person Tom Hawtin - tackline; 15.03.2012
comment
Я бы сделал nom класса статическим, поле private (также nom static) и создал бы геттер для этого поля (но не сеттер). - person LeonardoSibela; 22.05.2019