Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Классы и Объекты
Перечислимые Типы
Домашняя страница > Изучение Языка Java > Классы и Объекты

Перечислимые Типы

Перечислимый тип является типом, поля которого состоят из фиксированного набора констант. Типичные примеры включают направления компаса (значения СЕВЕРА, ЮГА, ВОСТОКА, и ЗАПАДА) и дни недели.

Поскольку они - константы, имена полей перечислимого типа находятся в прописных буквах.

В языке программирования Java Вы определяете перечислимый тип при использовании enum ключевое слово. Например, Вы определили бы перечислимый тип "дни недели" как:


public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

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

Вот некоторый код, который показывает Вам, как использовать Day перечисление, определенное выше:


public class EnumTest {
    Day day;
    
    public EnumTest(Day day) {
        this.day = day;
    }
    
    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
                    
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("Weekends are best.");
                break;
                        
            default:
                System.out.println("Midweek days are so-so.");
                break;
        }
    }
    
    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

Вывод:

Mondays are bad.
Midweek days are so-so.
Fridays are better.
Weekends are best.
Weekends are best.

Типы перечисления языка программирования Java намного более мощны чем их дубликаты на других языках. enum объявление определяет class (названный перечислимым типом). Перечислимое тело class может включать методы и другие поля. Компилятор автоматически добавляет некоторые специальные методы, когда он создает перечисление. Например, у них есть помехи values метод, который возвращает массив, содержащий все значения перечисления в порядке, которым они объявляются. Этот метод обычно используется в комбинации с для - каждая конструкция, чтобы выполнить итерации по значениям перечислимого типа. Например, этот код от Planet Пример class ниже выполняет итерации по всем планетам в солнечной системе.

for (Planet p : Planet.values()) {
    System.out.printf("Your weight on %s is %f%n",
                      p, p.surfaceWeight(mass));
}

Отметьте: Все перечисления неявно расширяются java.lang.Enum. Так как Java не поддерживает множественное наследование, перечисление не может расширить ничто больше.

В следующем примере, Planet перечислимый тип, который представляет планеты в солнечной системе. Они определяются с помощью постоянной массы и свойств радиуса.

Каждая перечислимая константа объявляется со значениями для параметров радиуса и массы. Эти значения передают конструктору, когда константа создается. Java требует, чтобы константы были определены сначала до любых полей или методов. Кроме того, когда есть поля и методы, список перечислимых констант должен закончиться точкой с запятой.


Отметьте: конструктор для перечислимого типа должен быть частным на пакет или частным доступом. Это автоматически создает константы, которые определяются в начале перечислимого тела. Невозможно вызвать перечислимого конструктора самостоятельно.

В дополнение к его свойствам и конструктору, Planet имеет методы, которые позволяют Вам получать поверхностную силу тяжести и вес объекта на каждой планете. Вот пример программы, который берет Ваш вес на земле (в любом модуле) и вычисляет и печатает Ваш вес на всех планетах (в том же самом модуле):


public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

Если Вы работаете Planet.class из командной строки с параметром 175, Вы получаете этот вывод:

$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Вопросы и Упражнения: Вложенные Классы
Следующая страница: Вопросы и Упражнения: Перечислимые Типы