JavaRush /Блоги Java /Random-TG /15 Саволҳои мусоҳибаи таҳиякунанда дар бораи Enum дар Jav...
Treefeed
Сатҳи

15 Саволҳои мусоҳибаи таҳиякунанда дар бораи Enum дар Java (бо ҷавобҳо!)

Дар гурӯҳ нашр шудааст
Рӯйхат ( Enum ) дар Java 5 ҷорӣ карда шуд ва аз он вақт инҷониб он дар байни таҳиягарони Java хеле маъмул гаштааст. Он дар барномаҳои гуногуни Java васеъ истифода мешавад. Азбаски Enum дар Java нисбат ба C ё C++ хеле фарогиртар аст, он инчунин бисёр ҳолатҳои ҷолиби истифодаро пешниҳод мекунад, ки якчандтои онҳоро шумо дар мақолаи 10 Роҳҳои истифодаи Enum дар Java дидаед . Аммо сарфи назар аз ин маъруфият, бисёре аз барномасозони Java то ҳол аз функсияҳои пешниҳодкардаи Enum ва нозукиҳои истифодаи Enum дар codeи Java хабар надоранд. Ин аз якчанд хонандагоне маълум шуд, ки масалан, дар бораи қобorяти Enum барои татбиқ кардани интерфейс дар Java ё Чаро мо Enums -ро берун аз Enum эҷод карда наметавонем ва қайд кард, ки онҳо дар ин бора дар мусоҳиба пурсиданд. Ин ба мо илҳом бахшид, ки рӯйхати саволҳои зуд-зуд додашударо дар Java Enum тартиб диҳем , ки на танҳо ба шумо дар мусоҳибаҳо муваффақ шавед, балки роҳҳои навро барои омӯзиш боз кунанд. Тавре ки қаблан гуфта шуда буд, аксар вақт саволҳои мусоҳиба шуморо маҷбур мекунанд, ки мавзӯъро ҷиддӣ қабул кунед, ки ин кори бад нест ва бо назардошти қудрат ва фоиданокии Энум, вақти он расидааст, ки шумо устоди enum шудед. Дар зер рӯйхати саволҳо дар асоси функсияҳо ва хосиятҳои гуногуни Enum оварда шудаанд. Шумо метавонед онро ҳамчун маводи омодагӣ барои мусоҳиба ё танҳо дастур оид ба рӯйхат истифода баред. Агар шумо дар Java нав бошед, шумо дар бораи Enum бисёр чизҳои нав ва муфид хоҳед гирифт. 1) Может ли Enum наследовать (implement) интерфейс в Java? Да, Enum может наследовать интерфейсы. Поскольку Enum тип схож с классом и интерфейсом, он может наследовать интерфейс. Это даёт поразительную гибкость в использовании Enum в качестве специальной реализации в некоторых случаях. Вот неплохой пример использования Enum в таком качестве. 2) Может ли Enum наследовать (extends) класс? Нет, не может! Неожиданно, поскольку ранее говорилось что Enum тип похож на класс or интерфейс в Java. Ну, это главная причина, почему такой вопрос задают сразу за предыдущим. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы ordinal(), values() or valueOf(). 3) Как создать Enum без экземпляров an objectов? Возможно ли это без ошибки компиляции? Это один из тех хитрых вопросов, которые так любят интервьюеры. Поскольку Enum видится коллекцией определённого количества an objectов, How дни недели or месяцы в году получить Enum без ничего кажется подозрительным. Но да, вы можете создать Enum без экземпляров, например создавая утorтарный класс. Это ещё один инновационный способ использовать 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? What будет, если не будем переопределять? Конечно вы можете переопределить метод toString() у Enum, How и любого класса, наследующего java.lang.Object и имеющего метод toString() в доступности, и даже если вы не станете этого делать, ничего не потеряете, поскольку абстрактная основа класса Enum сделает это за вас, и вернёт Name, являющееся именем экземпляра Enum. Вот code метода toString() из класса Enum: public String toString() { return name; } name задано, когда компилятор выделяет code для создания перечисления в ответ на создание экземпляра в самом классе Enum, наравне с созданием порядкового числительного в конструкторе из класса java.lang.Enum: protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Это единственный конструктор для создания перечисления, который вызывается компилятором в ответ на декларирование Enum в программе. 5) Можем ли мы создать экземпляр Enum вне Enum? Почему нет? Вы не можете создавать экземпляры Enum вне границ Enum, поскольку у Enum нет public конструктора, и компилятор не позволит вам внести любой подобный конструктор. Так How компилятор генерирует большинство codeа в ответ на декларацию Enum типа, он не допускает public конструкторов внутри Enum, что заставляет объявлять экземпляры Enum внутри себя. 6) Можем ли мы указать конструктор внутри Enum? Этот вопрос часто следует за предыдущим. Да, вы можете, но помните, что подобное возможно лишь с указанием private or package-private конструкторов. Конструкторы с public и protected — не допустимы в Enum. Вот тут можно посмотреть пример. 7) Какая разница сравнивать Enum при помощи == or метода equals()? Это очень обширный и хитрый вопрос, который рассматривается подробно здесь. 8) What делает метод 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, который принимает Name и порядковый номер. 9) Можно использовать Enum с TreeSet or TreeMap в Java? Это действительно интересный вопрос по Enum, и его любят задавать для проверки глубины знаний. Пока вы не загляните в code java.lang.Enum, вы скорей всего не будете знать, что Enum наследует интерфейс Comparable, который является главным требованием для использования в упорядоченных коллекциях, How TreeSet и TreeMap. Поскольку Enum по умолчанию наследует интерфейс Comparable, он может использоваться с TreeSet и TreeMap. 10) Какая разница между ordinal() и compareTo() в Enum? Это прямое следование из предыдущего вопроса: на самом деле, compareTo() имитирует порядок, предоставляемый методом ordinal(), являющийся естественным порядком Enum. Если коротко, Enum ограничивает сравнения в порядке их объявления. Так же, стоит помнить, что данные константы сравнимы только с другими константами того же типа — сравнение разных типов констант может привести к ошибке компилятора. 11) Можно ли использовать Enum в switch case? Да, вы можете. Мало того, это одна из главных полезностей использования Enum. Поскольку экземпляры Enum компorруют временную константу, вы можете без опаски внедрять их внутрь case и switch. Вот например code с днями недели: 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 instead of паттернов перечисления int и перечисления String? Если вы программируете более 5 лет, и ещё застали JDK 1.3 or 1.4, вы будете на короткой ноге с паттернами перечисления String и int, где используется public static final префикс констант для представления коллекции общеизвестных фиксированных количеств вещей, How Дни Недели. Тут возникает множество проблем: у вас нет независимости типа Enum, поскольку переменная String отвечающая за день недели может принимать любое произвольное meaning. Точно так же перечисляемый int может принимать любое meaning, и компилятор спокойно проглотит это. А с использованием Enum , шумо бехатарии навъи онро мегиред, ки компилятор барои шумо тафтиш мекунад. Дар Effective Java якчанд фикрҳои ҷолиб дар бораи ин мавзӯъ мавҷуданд, ки барои ҳама таҳиягарони Java тавсия дода мешавад. 15) Чӣ тавр сатрро ба Enum табдил додан мумкин аст? Ин як саволи ҳамарӯзаест, ки аз сабаби маъруфияти истифодаи String ва Enum дар таҳияи барномаҳои Java ба миён меояд. Беҳтарин роҳи табдил додани Enum ба String ин муайян кардани усули заводӣ дар худи Enum мебошад, ки далелҳои Stringро гирифта, онро ҳамчун Enum бармегардонад . Шумо инчунин мехоҳед, ки парвандаро сарфи назар кунед. Инҳоянд чанд мисоли табдил додани сатрҳо ба рӯйхат. Ин моро ба охири рӯйхати 15 савол ( ва ҷавобҳо ) дар бораи Enum меорад. Аммо дар хотир доред: хондан барои омӯхтан кофӣ нест, ин танҳо қадами аввал аст . Барои аз ҳисобҳо баҳра бурдан, кӯшиш кунед, ки дар куҷо шумо метавонед Enum-ро дар лоиҳаи худ истифода баред - ин ба шумо таҷрибаи воқеии ҷаҳониро медиҳад ва бо ин таҷриба шумо бештар аз мисолҳо меомӯзед, зеро шумо бо мушкилоти бештаре дучор хоҳед шуд, ки шумо метавонед дар бештари онҳо ҳал кунед. роххои мураккаб ва муфассал.талабот. Ба ин саволҳо дар бораи Enum диққат додан лозим аст, то дониши худро санҷед, хусусан агар шумо ба мусоҳиба шитоб карда бошед ва барои фарогирии муфассал дар олами Энум вақт нест.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION