Java. Класс Enum. Методы класса Enum

Класс Enum. Методы класса Enum: clone(), compareTo(), getDeclaringClass(), hashCode(), name(), ordinal(), toString()

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Поиск на других ресурсах:

1. Класс Enum. Общие сведения. Обзор методов класса Enum

В языке Java все перечисления, объявляемые с помощью ключевого слова enum автоматически наследуются от обобщенного класса Enum. Согласно документации, общая форма объявления класса Enum следующая:

class Enum<E extends Enum<E>>

здесь

  • E – перечислительный тип.

У класса Enum нет открытых конструкторов.

Ниже приведен сокращенный перечень методов класса Enum, доступных во всех перечислениях:

  • clone() – вызов метода предотвращает клонирование перечислений;
  • compareTo() – сравнивает порядковые значения двух именуемых констант одного и того же перечисления;
  • getDeclaringClass() – возвращает тип перечисления, членом которого является вызывающая константа;
  • hashCode() – возвращает хэш-код объекта;
  • name() – возвращает имя именуемой константы;
  • ordinal() – возвращает позицию константы в списке констант перечисления;
  • toString() – возвращает имя именуемой константы.

 

2. Метод clone(). Предотвращение клонирования

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

protected final Object clone() throws CloneNotSupportedException

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

Следующий пример объясняет эту особенность.

Пример.

// Перечисление, определяющее общеизвестные временные интервалы
enum TimeIntervals {
  secondsInMinute(60), // количество секунд в одной минуте
  hoursInDay(24),       // количество часов в сутке
  daysPerWeek(7),       // количество дней в неделе
  daysInYear(365);     // количество дней в году

  // Конструктор
  TimeIntervals(int interval)
  {
    this.interval = interval;
  }

  // Внутренняя переменная, сохраняющая значение интервала времени
  private int interval;

  // Метод доступа к значению interval
  public int get() { return interval; }
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод clone() - сделать копию перечисления
    // 1. Создать экземпляр типа перечисления TimeIntervals
    TimeIntervals t1;

    // 2. Инициализировать перечисление t1 значением
    t1 = TimeIntervals.hoursInDay;

    // 3. Создать экземпляр другого перечисления и инициализировать его значением t1
    TimeIntervals t2 = t1;

    // 4. Вывести значение перечисления t2
    System.out.println(t2); // hoursInDay

    // 5. Изменить экземпляр перечисления t1 другим значением
    t1 = TimeIntervals.daysPerWeek;

    // 6. Повторно вывести значение перечисления t2
    System.out.println(t2); // hoursInDay - значение не изменилось
  }
}

Результат выполнения программы

hoursInDay
hoursInDay

Как видно из результата, при присвоении перечислений

...

// 3. Создать экземпляр другого перечисления и инициализировать его значением t1
TimeIntervals t2 = t1;

...

перечисления t1 и t2 указывают на разные участки памяти. То есть, не состоялось присваивание ссылок, как в случае с экземплярами классов. Этот факт доказывает результат вывода значения t2 после изменения значения в перечислении t1

...

// 5. Изменить экземпляр перечисления t1 другим значением
t1 = TimeIntervals.daysPerWeek;

// 6. Повторно вывести значение перечисления t2
System.out.println(t2); // hoursInDay - значение не изменилось

...

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

 

3. Метод compareTo(). Сравнить значения двух объектов перечисления

Метод compareTo() позволяет сравнить значения двух объектов одинакового типа перечисления. Согласно документации, метод имеет следующее объявление

public final int compareTo(E obj)

здесь

  • E – тип перечисления, имеющий текущее перечисление (объект) и перечисление (объект) obj. Текущее перечисление и перечисление obj должны быть одинакового типа E;
  • obj – перечисление (объект), которое сравнивается с текущим перечислением.

Метод сравнивает текущее перечисление с определенным перечислением, которое передается как параметр метода. Метод возвращает:

  • отрицательное число, если текущий объект меньше заданного объекта obj. Термин «меньше» означает, что значение текущей константы (объекта) следует перед значением константы obj в перечислении;
  • ноль (0), если значения текущей константы и константы obj равны между собой;
  • положительное число, если значение константы в текущем перечислении следует после значения константы в перечислении obj.

Пример.

В примере сравниваются значения констант из перечисления Seasons.

// Перечисление, которое описывает времена года
enum Seasons {
  Winter, Spring, Summer, Autumn
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод compareTo() - сравнить порядковые значения констант
    // 1. Объявить два перечисления и присвоить им значения
    Seasons s1, s2;
    s1 = Seasons.Summer;
    s2 = Seasons.Spring;

    // 2. Реализовать сравнение перечислений s1 и s2
    int result;
    result = s1.compareTo(s2); // 1
    System.out.println("Seasons.Summer == Seasons.Spring => " + result);

    s1 = Seasons.Winter;
    s2 = Seasons.Winter;
    result = s2.compareTo(s1); // 0
    System.out.println("Seasons.Winter == Seasons.Winter => " + result);

    s1 = Seasons.Spring;
    s2 = Seasons.Autumn;
    result = s1.compareTo(s2); // -2
    System.out.println("Seasons.Spring == Seasons.Autumn => " + result);
  }
}

Результат выполнения программы

Seasons.Summer == Seasons.Spring => 1
Seasons.Winter == Seasons.Winter => 0
Seasons.Spring == Seasons.Autumn => -2

Как показывает результат, метод compareTo() возвращает разницу между порядковыми номерами констант текущего перечисления и перечисления, являющегося входным параметром метода.

 

4. Метод getDeclaringClass(). Получить информацию о перечислении

С помощью метода getDeclaringClass() можно получить исчерпывающую информацию о перечислении (список констант, перечень методов, конструкторов в перечислении и т.п.).

Согласно документации Java, объявление метода следующее

public final Class<E> getDeclaringClass()

здесь

  • E – тип перечисления.

Метод возвращает объект класса, соответствующий типу перечисления E.

Пример.

В примере показано использование метода getDeclaringClass() для определения некоторых характеристик перечислений Days и Seasons.

import java.lang.reflect.Field;

// Перечисление, описывающее дни недели
enum Days {
  Sun, Mon, Tue, Wed, Thu, Fri, Sat
}

// Перечисление, которое описывает времена года
enum Seasons {
  Winter, Spring, Summer, Autumn
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод getDeclaringClass() - получить задекларированный класс
    // 1. Объявить экземпляр перечисления типа Days
    Days day = Days.Mon;

    // 2. Вывести имя перечисления Days
    String nameClass = day.getDeclaringClass().getName();
    System.out.println(nameClass);

    // 3. Получить данные об экземпляре season1 перечисления Seasons
    Seasons season1 = Seasons.Summer;
    Class<Seasons> classSeason1 = season1.getDeclaringClass();

    // 3.1. Вывести название класса
    System.out.println(classSeason1.getName());
    System.out.println(classSeason1.getTypeName());

    // 3.2. Вывести названия полей из перечисления Seasons
    System.out.println("-----------------------------------");
    Field[] fl = classSeason1.getDeclaredFields();

    for (int i=0; i<fl.length; i++)
      System.out.println(fl[i].getName());
  }
}

Результат выполнения программы

Days
Seasons
Seasons
-----------------------------------
Winter
Spring
Summer
Autumn
ENUM$VALUES

 

5. Метод hashCode(). Получить хэш-код объекта

Метод hashCode() возвращает хэш-код объекта. Метод имеет следующее объявление

public final int hashCode()

Пример.

// Перечисление, которое описывает дни недели
enum Days {
  Sun, Mon, Tue, Wed, Thu, Fri, Sat
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод hashCode() - получить хэш-код объекта
    Days day = Days.Sat;
    int hCode = day.hashCode(); // 366712642
    System.out.println(hCode);
  }
}

Результат выполнения программы

366712642

 

6. Метод name(). Получить имя именованной константы

С помощью метода name() можно получить имя именованной константы в списке констант перечисления. Согласно документации Java, общая форма метода name() следующая:

public final String name()

Метод name() может использоваться в особых ситуациях, когда необходимо правильно получить точное имя, которое не будет изменяться от выпуска к выпуску.

// Перечисление, описывающее цвета
enum Colors {
  Red, Green, Blue, Yellow, Brown
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод name() - возвращает имя именованной константы
    Colors color = Colors.Brown;
    String nameOfColor = color.name(); // получить имя
    System.out.println(nameOfColor);
  }
}

Результат выполнения программы

Brown

 

7. Метод ordinal(). Получить позицию константы в перечислении

С помощью метода ordinal() можно получить позицию константы в перечислении. Позиции нумеруются с нуля. Объявление метода следующее:

public final int ordinal()

Пример.

// Перечисление, описывающее дни недели
enum Days {
  Sun, Mon, Tue, Wed, Thu, Fri, Sat
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод ordinal() - получить позицию константы
    Days day = Days.Wed;
    int ordNum = day.ordinal();
    System.out.println("Wed = " + ordNum);

    day = Days.Sat;
    ordNum = day.ordinal();
    System.out.println("Sat = " + ordNum);

    day = Days.Sun;
    ordNum = day.ordinal();
    System.out.println("Sun = " + ordNum);
  }
}

Результат выполнения программы

Wed = 3
Sat = 6
Sun = 0

 

8. Метод toString(). Получить имя константы в перечислении

Метод toString() возвращает имя константы перечисления, которое содержится в объявлении. По желанию, метод может быть переопределен для получения имени константы в более удобной форме.

Согласно документации Java объявление метода следующее

public String toString()

Пример.

// Перечисление, описывающее дни недели
enum Days {
  Sun, Mon, Tue, Wed, Thu, Fri, Sat
}

public class TrainEnumerations {

  public static void main(String[] args) {
    // Метод toString() - получить имя константы
    // 1. Объявить экземпляр перечисления типа Days
    Days day = Days.Mon;

    // 2. Вывести имя константы из экземпляра day
    String name = day.toString();
    System.out.println(name);   // Mon

    // 3. Вывести имя константы из типа Days
    name = Days.Sun.toString();
    System.out.println(name);   // Sun
  }
}

Результат выполнения программы

Mon
Sun

 


Связанные темы