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() – повертає ім’я іменованої константи;
  • valueOf() – повертає константу, що зв’язана з заданим іменем в зчисленні.

 

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

 


Споріднені теми