JavaRush /Blog Java /Random-ES /15 preguntas de la entrevista para desarrolladores sobre ...
Treefeed
Nivel 21

15 preguntas de la entrevista para desarrolladores sobre Enum en Java (¡con respuestas!)

Publicado en el grupo Random-ES
La enumeración ( Enum ) se introdujo en Java 5 y desde entonces se ha vuelto bastante popular entre los desarrolladores de Java. Es ampliamente utilizado en varias aplicaciones Java. Debido a que Enum en Java es mucho más versátil que en C o C++, también presenta muchos casos de uso interesantes, algunos de los cuales viste en el artículo 10 formas de usar Enum en Java . Pero a pesar de esta popularidad, muchos programadores de Java aún desconocen la funcionalidad proporcionada por Enum y las complejidades del uso de Enum en código Java. Esto quedó claro cuando varios lectores preguntaron, por ejemplo, sobre la capacidad de Enum para implementar una interfaz en Java o por qué no podemos crear instancias de Enums fuera de Enum , y señalaron que se les preguntó sobre esto en una entrevista. Esto nos inspiró a compilar una lista de preguntas frecuentes en Java Enum que no solo lo ayudarán a tener éxito en las entrevistas, sino que también abrirán nuevas vías de aprendizaje. Como se indicó anteriormente, a menudo las preguntas de la entrevista te obligan a tomar el tema más en serio, lo cual no es malo, y dado el poder y la utilidad de Enum, es hora de que te conviertas en un maestro de enum. A continuación se muestra una lista de preguntas basadas en diversas funciones y propiedades de Enum. Puede utilizarlo como material preparatorio para una entrevista o simplemente como guía para la enumeración. Si es nuevo en Java, aprenderá muchas cosas nuevas y útiles sobre Enum. 1) Может ли Enum наследовать (implement) интерфейс в Java? Да, Enum может наследовать интерфейсы. Поскольку Enum тип схож с классом и интерфейсом, он может наследовать интерфейс. Это даёт поразительную гибкость в использовании Enum в качестве специальной реализации в некоторых случаях. Вот неплохой пример использования Enum в таком качестве. 2) Может ли Enum наследовать (extends) класс? Нет, не может! Неожиданно, поскольку ранее говорилось что Enum тип похож на класс o интерфейс в Java. Ну, это главная причина, почему такой вопрос задают сразу за предыдущим. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы ordinal(), values() o valueOf(). 3) Как создать Enum без экземпляров un objetoов? Возможно ли это без ошибки компиляции? Это один из тех хитрых вопросов, которые так любят интервьюеры. Поскольку Enum видится коллекцией определённого количества un objetoов, Cómo дни недели o месяцы в году получить Enum без ничего кажется подозрительным. Но да, вы можете создать Enum без экземпляров, например создавая утoтарный класс. Это ещё один инновационный способ использовать 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? Qué будет, если не будем переопределять? Конечно вы можете переопределить метод toString() у Enum, Cómo и любого класса, наследующего java.lang.Object и имеющего метод toString() в доступности, и даже если вы не станете этого делать, ничего не потеряете, поскольку абстрактная основа класса Enum сделает это за вас, и вернёт Nombre, являющееся именем экземпляра Enum. Вот código метода toString() из класса Enum: public String toString() { return name; } name задано, когда компилятор выделяет código для создания перечисления в ответ на создание экземпляра в самом классе Enum, наравне с созданием порядкового числительного в конструкторе из класса java.lang.Enum: protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Это единственный конструктор для создания перечисления, который вызывается компилятором в ответ на декларирование Enum в программе. 5) Можем ли мы создать экземпляр Enum вне Enum? Почему нет? Вы не можете создавать экземпляры Enum вне границ Enum, поскольку у Enum нет public конструктора, и компилятор не позволит вам внести любой подобный конструктор. Так Cómo компилятор генерирует большинство códigoа в ответ на декларацию Enum типа, он не допускает public конструкторов внутри Enum, что заставляет объявлять экземпляры Enum внутри себя. 6) Можем ли мы указать конструктор внутри Enum? Этот вопрос часто следует за предыдущим. Да, вы можете, но помните, что подобное возможно лишь с указанием private o package-private конструкторов. Конструкторы с public и protected — не допустимы в Enum. Вот тут можно посмотреть пример. 7) Какая разница сравнивать Enum при помощи == o метода equals()? Это очень обширный и хитрый вопрос, который рассматривается подробно здесь. 8) Qué делает метод 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, который принимает Nombre и порядковый номер. 9) Можно использовать Enum с TreeSet o TreeMap в Java? Это действительно интересный вопрос по Enum, и его любят задавать для проверки глубины знаний. Пока вы не загляните в código java.lang.Enum, вы скорей всего не будете знать, что Enum наследует интерфейс Comparable, который является главным требованием для использования в упорядоченных коллекциях, Cómo TreeSet и TreeMap. Поскольку Enum по умолчанию наследует интерфейс Comparable, он может использоваться с TreeSet и TreeMap. 10) Какая разница между ordinal() и compareTo() в Enum? Это прямое следование из предыдущего вопроса: на самом деле, compareTo() имитирует порядок, предоставляемый методом ordinal(), являющийся естественным порядком Enum. Если коротко, Enum ограничивает сравнения в порядке их объявления. Так же, стоит помнить, что данные константы сравнимы только с другими константами того же типа — сравнение разных типов констант может привести к ошибке компилятора. 11) Можно ли использовать Enum в switch case? Да, вы можете. Мало того, это одна из главных полезностей использования Enum. Поскольку экземпляры Enum компoруют временную константу, вы можете без опаски внедрять их внутрь case и switch. Вот например código с днями недели: 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 en lugar de паттернов перечисления int и перечисления String? Если вы программируете более 5 лет, и ещё застали JDK 1.3 o 1.4, вы будете на короткой ноге с паттернами перечисления String и int, где используется public static final префикс констант для представления коллекции общеизвестных фиксированных количеств вещей, Cómo Дни Недели. Тут возникает множество проблем: у вас нет независимости типа Enum, поскольку переменная String отвечающая за день недели может принимать любое произвольное significado. Точно так же перечисляемый int может принимать любое significado, и компилятор спокойно проглотит это. А с использованием Enum , obtienes la seguridad de tipos que el compilador verifica por ti. Hay algunas ideas interesantes sobre este tema en Effective Java, cuya lectura se recomienda a todos los desarrolladores de Java. 15) ¿Cómo convertir String a Enum? Esta es una pregunta diaria que surge debido a la popularidad del uso de String y Enum en el desarrollo de aplicaciones Java. La mejor manera de convertir un Enum en un String es definir un método de fábrica en el propio Enum que tomará argumentos String y lo devolverá como un Enum . Es posible que también desee ignorar mayúsculas y minúsculas. A continuación se muestran algunos ejemplos de cómo convertir cadenas en enumeraciones. Esto nos lleva al final de nuestra lista de 15 preguntas ( y respuestas ) sobre Enum. Pero recuerda: leer no es suficiente para aprender, es sólo el primer paso . Para beneficiarse de las enumeraciones, intente encontrar dónde puede usar Enum en su proyecto; esto le brindará experiencia del mundo real y con esta experiencia aprenderá más que con ejemplos, porque encontrará más problemas que podrá manejar en más requisitos complejos y detallados. Vale la pena prestar atención a estas preguntas sobre Enum para poner a prueba sus conocimientos, especialmente si tiene prisa por una entrevista y simplemente no hay tiempo para una inmersión detallada en el universo de Enum.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION