JavaRush /Java блог /Random UA /15 питань для співбесіди розробників щодо Enum у Джаві (з...
Treefeed
21 рівень

15 питань для співбесіди розробників щодо Enum у Джаві (з відповідями!)

Стаття з групи Random UA
Перелік ( Enum ) було введено в Java 5 і з тих пір воно стало дуже популярним серед розробників Java. Воно широко використовується у різних Java-додатках. Оскільки Enum Java набагато універсальніше, ніж C або C ++, воно також представляє безліч цікавих варіантів використання, пару з яких, ви бачабо в статті 10 способів використовувати Enum Java . Але, незважаючи на таку популярність, багато Java-програмістів, як і раніше, не знають про функціональність, що надається Enum і тонкощів використання Enum в Java коді. Це стало зрозуміло з питань кількох читачів, які запитують, наприклад, про можливість Enum реалізувати інтерфейс Java або Чому ми не можемо створити екземпляри Enum за межами Enum , зазначивши, що про це їх запитували на співбесіді. Це спонукало до збору списку часто задаваних питань у Java Enum, які не тільки допомагають досягти успіху в інтерв'ю, але й відкрити нові шляхи для навчання. Як говорилося раніше, часто питання на співбесіді змушують вас сприймати тему серйозніше, що не так вже й погано, і, враховуючи міць і корисність Enum, настав час вам стати майстром перерахувань. Нижче перелік питань, що базується на різному функціоналі та властивостях Enum. Ви можете використовувати його як підготовчий матеріал для співбесіди або просто довідник з перерахувань. Якщо ви новачок в Java, то почерпнете собі багато нового і корисного про Enum. 1) Чи може Enum успадкувати (implement) інтерфейс Java? Так, Enum може успадковувати інтерфейси . Оскільки тип Enum схожий з класом і інтерфейсом , він може успадковувати інтерфейс. Це дає разючу гнучкість у використанні Enum як спеціальну реалізацію в деяких випадках. Ось непоганий приклад використання Enum у такій якості. 2) Чи може Enum успадковувати (extends) клас? Ні не може! Несподівано, оскільки раніше говорилося, що Enum тип схожий на клас або інтерфейс Java. Ну, це головна причина, чому таке питання ставлять одразу за попереднім. Оскільки Enum вже успадковується від абстрактного класу java.lang.EnumЗрозуміло, що інший клас успадковувати не вдасться, оскільки Java не підтримує множинне успадкування класів. Завдяки успадкування від java.lang.Enum , всі перерахування мають методи ordinal() , values() або valueOf() . 3) Як створити Enum без екземплярів об'єктів? Чи це можливо без помилки компіляції? Це одне з тих хитрих питань , які так люблять інтерв'юери. Оскільки Enum бачиться колекцією певної кількості об'єктів, як дні тижня чи місяці на рік отримати Enum без нічого здається підозрілим. Але так, ви можете створити Enum без екземплярівнаприклад створюючи утилітарний клас. Це ще один інноваційний спосіб використовувати Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) Чи можемо ми перевизначити метод toString() для Enum? Що буде, якщо не перевизначатимемо? Звичайно ви можете перевизначити метод toString() у Enum, як і будь-якого класу, що успадковує java.lang.Object і має метод toString() у доступності, і навіть якщо ви не станете цього робити, нічого не втратите, оскільки абстрактна основа класу Enum зробить це за вас і поверне ім'я, що є ім'ям екземпляра Enum. Ось код методу toString() із класу Enum: public String toString() { return name; } nameзадано, коли компілятор виділяє код для створення перерахування у відповідь на створення екземпляра в самому класі Enum, нарівні зі створенням порядкового числівника в конструкторі з класу java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Це єдиний конструктор для створення перерахування програмі. 5) Чи можемо ми створити екземпляр Enum поза Enum? Чому ні? Ви не можете створювати екземпляри Enum поза межами Enum , оскільки Enum не має public конструктора, і компілятор не дозволить вам внести будь-який подібний конструктор. Так як компілятор генерує більшість коду у відповідь на декларацію типу Enum, він не допускає publicконструкторів усередині Enum, що змушує оголошувати екземпляри Enum у собі. 6) Чи можемо ми вказати конструктор усередині Enum? Це питання часто слідує за попереднім. Так, ви можете, але пам'ятайте, що подібне можливе лише із зазначенням private або package-private конструкторів. Конструктори з public і protected – не допустимі в Enum. Ось тут можна побачити приклад. 7) Яка різниця порівнювати Enum за допомогою == чи методу equals()? Це дуже широке і хитре питання, яке розглядається докладно тут . 8) Що робить метод ordinal() у Enum? Метод ordinal()(порядковий) повертає порядок, у якому екземпляри Enum позначені всередині Enum. Наприклад, у DayOfWeek Enum ви можете вказати дні по порядку: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } і якщо ми викличемо метод DayOfWeek.MONDAY.ordinal() , він поверне 0 - що означає перший екземпляр. Цей метод дуже корисний для надання порядку відповідно до реального стану речей: тобто вказуючи, що TUESDAY (вівторок) йде після MONDAY (понеділка) і перед WEDNESDAY (середовищем). Так само ви можете використовувати перелік для подання місяців року, де Лютий іде після Січня, але передує Марту. Всі перерахунки користувача успадковують цей метод з абстрактного класу java.lang.Enum, і вони встановлюються компілятором, викликаючи protected конструктор java.lang.Enum , який приймає ім'я і порядковий номер. 9) Чи можна використовувати Enum з TreeSet або TreeMap в Java? Це дійсно цікаве питання щодо Enum, і його люблять ставити для перевірки глибини знань. Поки ви не заглянете в код java.lang.Enum , ви швидше за все не знатимете, що Enum успадковує інтерфейс Comparable , який є головною вимогою для використання в упорядкованих колекціях, як TreeSet та TreeMap . Оскільки Enum за замовчуванням успадковує інтерфейс Comparable , він може використовуватися з TreeSet та TreeMap . 10) Яка різниця між ordinal() і compareTo() в Enum? Це пряме проходження з попереднього питання: насправді compareTo() імітує порядок, що надається методом ordinal() , що є природним порядком Enum. Якщо коротко, Enum обмежує порівняння у порядку їх оголошення. Також варто пам'ятати, що дані константи можна порівняти лише з іншими константами того ж типу — порівняння різних типів констант може призвести до помилки компілятора. 11) Чи можна використовувати Enum у switch case? Так, ви можете. Мало того, це одна з основних корисностей використання Enum. Оскільки екземпляри Enum компілюють тимчасову константу, ви можете без побоювання впроваджувати їх усередину case та switch. Ось, наприклад, код з днями тижня: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum і Switch відмінно доповнюють один одного, особливо якщо Enum містить невелику кількість стійких констант, наприклад, сім днів тижня, 12 місяців року і т. д. Подивіться на інші приклади використання swith case з Enum . 12) Як пройтися по всьому екземпляру Enum? Якщо ви відкривали java.lang.Enum , то знаєте, що метод values() повертає масив усіх констант Enum. Оскільки кожне перерахування успадковує java.lang.Enum , вони мають метод values() . Використовуючи його, ви можете пройти по всіх константах перерахування певного типу. Подивіться на приклади такого, проходячи з циклом foreach і методом values() . 13) Які плюси та мінуси використання Enum як синглтон? Enum надає швидкий ярлик для втілення патерну синглтона, і оскільки про це сказано навіть у книзі «Ефективна Java», такий вибір дуже популярний. На перший погляд, синглтон Enum багатообіцяючий і дуже зручний, наприклад, контролює створення екземпляра, безпечно серіалізується і насамперед, легко створити потокобезпечний синглтон з використанням Enum. Вам не потрібно більше дбати про подвійну перевірку волатильності змінних. Докладніше про плюси та мінуси використання такого підходу тут . 14) Яка вигода використовувати Enum замість патернів перерахування int та перерахування String? Якщо ви програмуєте більше 5 років і ще застали JDK 1.3 або 1.4, ви будете на короткій нозі з патернами перерахування String і int , де використовується public static final префікс констант для представлення колекції загальновідомих фіксованих кількостей речей, як Дні Тижня . Тут виникає безліч проблем: у вас немає незалежності типу Enum, оскільки змінна String , що відповідає за день тижня, може приймати будь-яке довільне значення. Так само перерахований int може приймати будь-яке значення, і компілятор спокійно проковтне це. А з використанням EnumВи отримуєте безпеку типів, які компілятор перевіряє для вас. На цю тему є кілька цікавих думок у «Ефективна Java», яку рекомендується прочитати всім розробникам Java. 15) Як перетворити String на Enum? Це щоденне питання, що постає через популярність застосування String і Enum у розробці програм Java. Кращий спосіб перетворити Enum в String , це визначити фабричний метод в самому Enum, який буде брати аргументи String і повертати як Enum . Ви також можете побажати ігнорувати регістр. Ось кілька прикладів щодо перетворення рядків на перерахування. Ось і добіг кінця наш список з 15 питань ( та відповідей ) про Enum. Але пам'ятайте: читання мало для навчання, це лише перший крок . Щоб отримати вигоду від перерахувань, спробуйте знайти, де можна використовувати Enum у вашому проекті - це дасть вам реальний досвід, і з цим досвідом ви вивчите більше, ніж на прикладах, оскільки зустрінете більше проблем, справляючись з якими, обробите складніші і докладніші вимоги. На ці питання про Enum варто звернути увагу для тестування ваших знань, особливо якщо ви поспішаєте на співбесіду, і часу на детальне занурення у всесвіт Enum просто немає.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ