Spec-Zone .ru
спецификации, руководства, описания, API
|
Перечислимый тип является типом, поля которого состоят из фиксированного набора констант. Типичные примеры включают направления компаса (значения СЕВЕРА, ЮГА, ВОСТОКА, и ЗАПАДА) и дни недели.
Поскольку они - константы, имена полей перечислимого типа находятся в прописных буквах.
В языке программирования 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