Клас Enum. Методи класу Enum: clone(), compareTo(), getDeclaringClass(), hashCode(), name(), ordinal(), toString()
Перед вивченням даної теми рекомендується ознайомитись з наступною темою:
Зміст
- 1. Клас Enum. Загальні відомості. Огляд методів класу Enum
- 2. Метод clone(). Запобігання клонуванню
- 3. Метод compareTo(). Порівняти значення двох об’єктів зчислення
- 4. Метод getDeclaringClass(). Отримати інформацію про зчислення
- 5. Метод hashCode(). Отримати хеш-код об’єкту
- 6. Метод name(). Отримати ім’я іменованої константи
- 7. Метод ordinal(). Отримати позицію константи в зчисленні
- 8. Метод 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
⇑
Споріднені теми
- Зчислення (enumeration). Загальні поняття. Ключове слово enum. Приклади
- Використання зчислень як класів. Приклади оголошення зчислень, що містять конструктори, внутрішні поля, методи
⇑