Итак, я просмотрел этот тип "enum", и это похоже на прославленный массив / ArrayList
/List
для меня. Что именно его использует?
Какое использование "enum" в Java?
Ответ 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, это просто альтернативный метод.