GrabDuck

Перечисления enum | Java

:

Последнее обновление: 30.10.2015

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

enum Day{

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

Теперь используем перечисление в программе:

package bookstore;

class Book{

    String name;
    Type bookType;
    String author;
    int year;

    Book(String name, String author, int year, Type type){
        
        bookType = type;
        this.name = name;
        this.author = author;
        this.year = year;
    }
}

enum Type
{
    SCIENCE,
    BELLETRE,
    PHANTASY,
    SCIENCE_FICTION
}

Само перечисление объявлено вне класса, оно содержит четыре жанра книг. Класс Book кроме обычных переменных содержит также переменную типа нашего перечисления. В конструкторе мы ее также можем присвоить, как и обычные поля класса.

Теперь используем класс Book и перечисление в главном классе:

package bookstore;

import java.util.Scanner;

public class BookStore {

    public static void main(String[] args) {
        
        Book b1 = new Book("Война и мир", "Л. Н. Толстой", 1863, Type.BELLETRE);
        
        Scanner in = new Scanner(System.in);
        System.out.println("Введите числовой тип книги:");
        int id = in.nextInt();
        
        Type type = Type.values()[id];
        System.out.println("Выбран тип: " + type);
        if(b1.bookType==type){
            
            System.out.println("Книга '"+b1.name + "' соответствует выбранному типу");
        }
    } 
}

Чтобы установить значение поля для типа книг, в конструктор передается значение Type.BELLETRE. Потом пользователь вводит любое число от 0 до 3 для выбора жанра книги. Данное число затем используется в качестве индекса в массиве значений перечислений.

Для получения всех значений перечисления применяется метод values(), который возвращает массив. В нем находятся все значения перечисления в том порядке, в котором мы их объявили. То есть константа Type.BELLETRE будет иметь номер 1, так как она является второй, а индексация начинается с нуля.

И в конце мы можем сравнить тип конкретной книги с выбранным типом: if(b1.bookType==type). Равным образом мы могли бы написать, например, if(b1.bookType==Type.SCIENCE)

Используя метод ordinal() можно получить номер конкретного значения перечисления: int number = Type.SCIENCE.ordinal();. И так как значение SCIENCE объявлено первым в списке значений, то переменная number будет иметь значение 0.