Какое использование "enum" в Java?

Итак, я просмотрел этот тип "enum", и это похоже на прославленный массив / ArrayList/List для меня. Что именно его использует?

Ответ 1

Enum служит типом фиксированного числа констант и может использоваться по крайней мере для двух вещей

константа

public enum Month {
    JANUARY, FEBRUARY, ...
}

Это намного лучше, чем создание кучи целочисленных констант.

создание однострочного

public enum Singleton {
    INSTANCE

   // init
};

Вы можете сделать довольно интересные вещи с перечислениями, посмотрите здесь

Также посмотрите официальную документацию

Ответ 2

Вместо class используется enum, если класс должен иметь фиксированное количество перечислимых экземпляров.

<сильные > Примеры:

  • DayOfWeek = 7 экземпляров → enum
  • CardSuit   = 4 экземпляра → enum
  • Singleton = 1 экземпляр   → enum

  • Product       = переменное число экземпляров → class
  • User             = = переменное число экземпляров → class
  • Date               = = число переменных экземпляров → class

Ответ 3

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

Вот простой пример, чтобы объяснить, почему:

Предполагая, что вы пишете метод, который имеет какое-то отношение к сезонам:

Шаблон int enum

Во-первых, вы объявили некоторые статические константы, которые будут отображаться каждый сезон.

public static final int SPRING = 0;
public static final int SUMMER = 1;
public static final int FALL = 2;
public static final int WINTER = 2;

Затем вы объявили метод печати названия сезона в консоли.

public void printSeason(int seasonCode) {
    String name = "";
    if (seasonCode == SPRING) {
        name = "Spring";
    }
    else if (seasonCode == SUMMER) {
        name = "Summer";
    }
    else if (seasonCode == FALL) {
        name = "Fall";
    }
    else if (seasonCode == WINTER) {
        name = "Winter";
    }
    System.out.println("It is " + name + " now!");
}

Итак, после этого вы можете напечатать название сезона, подобное этому.

printSeason(SPRING);
printSeason(WINTER);

Это довольно распространенный (но плохой) способ делать разные вещи для разных типов членов в классе. Однако, поскольку этот код включает целые числа, вы можете также вызвать метод, подобный этому, без каких-либо проблем.

printSeason(0);
printSeason(1);

или даже как это

printSeason(x - y);
printSeason(10000);

Компилятор не будет жаловаться, поскольку эти вызовы методов действительны, и ваш метод printSeason может работать.

Но здесь что-то не так. Что означает код сезона 10000? Что делать, если x - y приводит к отрицательному числу? Когда ваш метод получает вход, который не имеет значения и не должен быть там, ваша программа ничего не знает об этом.

Вы можете исправить эту проблему, например, добавив дополнительную проверку.

...
else if (seasonCode == WINTER) {
    name = "Winter";
}
else {
    throw new IllegalArgumentException();
}
System.out.println(name);

Теперь программа выдает RunTimeException, когда код сезона недействителен. Однако вам все равно нужно решить, как вы собираетесь обрабатывать исключение.

Кстати, я уверен, что вы заметили, что код FALL и WINTER оба равны 2, правильно?

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

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

Это, когда enum вступает в игру.


Используйте enum тип

В Java типы enum - это классы, которые экспортируют один экземпляр для каждой константы перечисления через публичное статическое конечное поле.

Здесь вы можете объявить четыре константы перечисления: SPRING, SUMMER, FALL, WINTER. Каждый из них имеет свой собственный name.

public enum Season {
    SPRING("Spring"), SUMMER("Summer"), FALL("Fall"), WINTER("Winter");

    private String name;

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

    public String getName() {
        return name;
    }
}

Теперь вернемся к методу.

public void printSeason(Season season) {
    System.out.println("It is " + season.getName() + " now!");
}

Вместо использования int теперь вы можете использовать Season в качестве входа. Вместо проверки состояния вы можете сообщить Season, чтобы указать свое имя.

Вот как вы теперь используете этот метод:

printSeason(Season.SPRING);
printSeason(Season.WINTER);
printSeason(Season.WHATEVER); <-- compile error

При использовании неправильного ввода вы получите ошибку времени компиляции, и вы гарантированно получите ненулевую одноэлементную ссылку Season, пока компиляция программы.

Когда нам нужен дополнительный сезон, мы просто добавляем еще одну константу в Season и не более.

public enum Season {
    SPRING("Spring"), SUMMER("Summer"), FALL("Fall"), WINTER("Winter"), 
    MYSEASON("My Season");

...

Всякий раз, когда вам нужен фиксированный набор констант, enum может быть хорошим выбором (но не всегда). Это более читаемое, более надежное и более мощное решение.

Ответ 4

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

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();
    }
}

Вывод:

Понедельники плохие.
Дни Midweek - это так. лучше.
Лучшие выходные - лучшие.
Лучшие дни.

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

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

В дополнение к своим свойствам и конструктору, 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 Планета 175
Ваш вес на MERCURY - 66.107583
Ваш вес на VENUS составляет 158.374842
Ваш вес на ЗЕМЛЕ 175.000000
Ваш вес на MARS - 66.279007
Ваш вес на JUPITER - 442.847567
Ваш вес на SATURN - 186.552719
Ваш вес на URANUS - 158.397260
Ваш вес на NEPTUNE 199.207413

Источник: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Ответ 5

enum - безопасный тип, поэтому вы не можете назначить новое значение во время выполнения. Более того, вы можете использовать его в инструкции switch (например, int).

Ответ 6

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

Вы должны использовать перечисления, в противном случае вы бы использовали несколько статических целочисленных констант (например, public static int ROLE_ADMIN = 0 или BLOOD_TYPE_AB = 2)

Основными преимуществами использования перечислений вместо них являются безопасность типов, предупреждения/ошибки типа компиляции при попытке использовать неправильные значения и предоставление пространства имен для соответствующих "констант". Кроме того, они легче использовать в среде IDE, так как она также помогает в завершении кода.

Ответ 7

Язык программирования Java enums гораздо эффективнее, чем их коллеги на других языках, которые представляют собой нечто большее, чем прославленные целые числа. Новое объявление enum определяет полноценный класс (называемый типом перечисления). В дополнение к решению всех проблем (Not typesafe, No namespace, Brittleness and Printed values are uninformative), которые существуют с последующим шаблоном int Enum, который использовался до java 5.0:

public static final int SEASON_WINTER = 0;

он также позволяет добавлять произвольные методы и поля в тип перечисления, реализовывать произвольные интерфейсы и многое другое. Типы Enum обеспечивают высококачественные реализации всех методов Object. Они Comparable и Serializable, а серийная форма предназначена для того, чтобы выдерживать произвольные изменения типа перечисления. Вы также можете использовать Enum в switch случае.

Подробнее читайте в полной статье о Java Enums http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html.

Ответ 8

1) enum - это ключевое слово в объектно-ориентированном методе.

2) Он используется для написания кода в одной строке, что он не более того.

     public class NAME
     {
        public static final String THUNNE = "";
        public static final String SHAATA = ""; 
        public static final String THULLU = ""; 
     }

-------This can be replaced by--------

  enum NAME{THUNNE, SHAATA, THULLU}

3) Большинство разработчиков не используют ключевое слово enum, это просто альтернативный метод.