LiveHelp
:: О компании :: Портфолио :: Основные услуги :: Дополнительные услуги :: Информация

Тип данных Enum в языке Java

Некоторые интересные особенности языка Java как на зло не описываются в печатной литературе. Такая ситуация у меня возникла с типом данных Enum, который в принципе есть, но о нем мало кто знает. Даже на сайте компании Oracle про этот тип написано в отдельном, далеко запрятанном от посторонних глаз, разделе.

Enum тип - это тип, поля которого содержат фиксированное количество констант. Общим примером может быть указание направления компаса(NORTH, SOUTH, EAST, WEST) и дни недели. Имена полей указаны заглавными буквами, поскольку это константы.

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

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

Для представления фиксированного количества констант Enum типы могут использоваться необходимое количество раз. Так что в программе совершенно естественно могут использоваться такие Enum типы как планеты солнечной системы и набор данных, где вы указываете все возможные действия, компилируемые в этот раз - например, выбор меню, строки выполнения команд и т. д.

Ниже приводится код, который показывает как использовать перечислимый тип 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.

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

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

Примечание: Все Enum типы имеют безусловное расширение согласно структуры java.lang.Enum. Так как Java не поддерживает сложное наследование, Enum типы не могут иметь каких-либо еще расширений.

В следующем примере Planet - это enum тип, который описывает планеты солнечной системы. Они определены свойствами, которые включают константы массы и радиуса. Это означает, что константы массы и радиуса используются для enum типа в качестве параметров. Эти величины передаются конструктору, когда константа создана. Поэтому Java требует, чтобы в программе константы определялись перед какими-либо полями или процедурами. Также при определении полей и процедур список констант должен разделяться запятой.

Примечание: Конструктор для enum типа работает с частными переменными упакованного типа или частными переменными прямого доступа. Автоматически создаются константы, которые определяются в начале тела описания enum типа. Конструктор не может вызываться вами самостоятельно.

Дополнительно с работой конструктора списков класс 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
Назойливая реклама:

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

Share this

Мы на других сайтах

F P V