Перечисления в Java

Помечено: ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 4 месяца, 1 неделя назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6482
      @admin
      StudLance.ru

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

      Значения задаются идентификаторами, каждому из которых сопоставляется целое число и строка, с именем идентификатора.

      Для каждого перечисления определено два статических метода:

      • values() — возвращает массив всех значений перечисления;
      • valueOf(String name) — возвращает константу перечисления
        соответствующую указанной строке.

      // пример определения перечисления EnumTest 
      public enum EnumTest {
          // идентификаторы перечисления
          RED, GREEN, BLUE, WHITE, BLACK, GRAY, YELLOW;
      
      	boolean isMonochorome() {
      		return this==BLACK || this==WHITE || this==GRAY;
      	}
      }
      
      //-------------------------------------
      //вывод всех доступных значений
      for (EnumTest k: EnumTest.values())
           System.out.println(k);

      класс Enum

      Внутренне все перечисления наследуются от класса Enum, для которого определены следующие методы:

      • compareTo(E o) — метод сравнения с объектом (интерфейс Comparable). Возвращает отрицательное, ноль или положительное целое значение, если объект меньше, равен или больше указанного объекта;
      • int ordinal() — возвращает целочисленную константу, связанную с этим объектом;
      • toString() — возвращает имя строковой константы, связанной с этим объектом.

      перечисления в switch

      Перечисления легко встраиваются в оператор выбора switch. Так как тип перечисления определяется на уровне switch, то в case предложениях тип можно опустить и указывать просто идентификаторы перечисления.

      // пример использования перечисления
      public class Test {
      	public static void main(String[] args) {
      		EnumTest e = EnumTest.BLACK;
      		System.out.println(e);
      		System.out.println(e.isMonochorome());
      
      		System.out.println("==============");
      		e = EnumTest.GREEN;
      		switch (e) {
      		case RED: // хотя можно и EnumTest.RED 
      			System.out.println("1 - " + e);
      			break;
      		case GREEN:
      			System.out.println("2 - " + e);
      			break;
      		case BLUE:
      			System.out.println("3 - " + e);
      			break;
      		default:
      			System.out.println("non rgb color");
      		}
      	}
      }

      дополнительный конструктор

      Можно определить собственную инициализацию элементов перечисления

      // пример из <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank" rel="noopener noreferrer">офф. док</a>
      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;   // масса в килограммах
          private final double radius; // радиус в метрах
          
          Planet(double mass, double radius) {
              this.mass = mass;
              this.radius = radius;
          }
          
          private double mass()   { return mass; }
          private double radius() { return radius; }
      
          // универсальная константа гравитации (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();
          }
         //...
      }

      пользовательские именя для перечисления

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

      enum Options {
              OP_SEND, OP_FILEINFO, OP_VIEW, OP_EDIT, OP_DELETE, OP_TOBUFFER;
      
              private static String[] customString;
      
              public static void setCustomString(String[] a) {
                  customString = a;
              }
      
              public String toString() {
                  if (customString != null)
                      return customString[this.ordinal()];
                  else
                      return name();
              }
      
              public static Options valueOfCustom(String customName) {
      
                  if (customString == null) {
                      return valueOf(customName);
                  }
      
                  Options val[] = values();
                  for (Options o : val) {
                      if (customName.equals(o.toString())) {
                          return o;
                      }
                  }
                  throw new IllegalArgumentException();
              }
          }

      расширение перечисления

      В документации по синтаксису java также приведен пример сопоставления с каждым значением перечисления своего поведения. В этом случае каждый элемент фактически является отдельным вложенным классом.

      import java.util.*;
      public enum Operation {
          PLUS {
              double eval(double x, double y) { return x + y; }
          },
          MINUS {
              double eval(double x, double y) { return x - y; }
          },
          TIMES {
              double eval(double x, double y) { return x * y; }
          },
          DIVIDED_BY {
              double eval(double x, double y) { return x / y; }
          };
          // Perform the arithmetic operation represented by this constant
         // abstract double eval(double x, double y);
          public static void main(String args[]) {
              double x = Double.parseDouble(args[0]);
              double y = Double.parseDouble(args[1]);
      
              for (Operation op : Operation.values())
                  System.out.println(x + " " + op + " " + 
                            y + " = " + op.eval(x, y));
          }
      }

      специализированные классы

      Для перечислений введено два оптимизированных класса EnumMap и EnumSet, которые используются вместо обычных классов HashMap и Set, реализующих отображение и множество соответственно. Элементы в обоих классах располагаются в порядке объявления элементов перечисления.

      Map<EnumTest, AnyClass> ps = new EnumMap<EnumTest, AnyClass (EnumTest.class);
      EnumSet<EnumTest> set = EnumSet.range(EnumTest.WHITE, EnumTest.GRAY);
      //...

      StudLance.ru

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×