249.50K
Category: programmingprogramming

Собеседование Enum

1.

Enum

2.

Вопрос 1
Может ли Enum наследовать (implement) интерфейс?

3.

Может ли Enum наследовать
(implement) интерфейс?
Да, Enum может наследовать интерфейсы.
Это даёт поразительную гибкость в использовании Enum
в качестве специальной реализации в некоторых
случаях.

4.

Вопрос 2
Может ли Enum наследовать (extends) класс?

5.

Может ли Enum наследовать
(extends) класс?
Нет, не может!
Поскольку Enum уже наследуется от абстрактного класса
java.lang.Enum, понятно, что другой класс наследовать
не удастся, поскольку Java не поддерживает
множественное наследование классов.
Благодаря наследованию от java.lang.Enum, все
перечисления имеют методы ordinal(), values() или
valueOf().

6.

Вопрос 3
Можно ли создать Enum без экземпляров объектов?

7.

Можно ли создать Enum без
экземпляров объектов?
Да, вы можете создать Enum без экземпляров, например
создавая утилитарный класс.
public enum MessageUtil{
; // required to avoid compiler error, also signifies no instance
public static boolean isValid() {
throw new UnsupportedOperationException("Not
supported yet.");
}
}

8.

Вопрос 4
Можем ли мы переопределить метод toString() для
Enum?

9.

Можем ли мы переопределить
метод toString() для Enum?
Мы можем переопределить метод toString() у Enum, как и
любого класса, наследующего java.lang.Object и
имеющего метод toString() в доступности.

10.

Вопрос 5
Что будет, если не будем переопределять метод toString()
для Enum?

11.

Что будет, если не будем переопределять
метод toString() для Enum?
Абстрактная основа класса Enum сделает это за нас, и
вернёт имя, являющееся именем экземпляра Enum.
Вот код метода toString() из класса Enum:
public String toString() {
return name;
}
name задано, когда компилятор выделяет код для
создания перечисления в ответ на создание
экземпляра в самом классе Enum

12.

Вопрос 6
Можем ли мы указать конструктор внутри Enum?

13.

Можем ли мы указать
конструктор внутри Enum?
Да, Мы можете, но лишь с указанием private или packageprivate конструкторов.
Конструкторы с public и protected — не допустимы в
Enum.

14.

Вопрос 7
Можем ли мы создать экземпляр Enum вне Enum?

15.

Можем ли мы создать
экземпляр Enum вне Enum?
Мы не можете создавать экземпляры Enum вне границ
Enum, поскольку у Enum нет public конструктора, и
компилятор не позволит вам внести любой подобный
конструктор.
Так как компилятор генерирует большинство кода в ответ
на декларацию Enum типа, он не допускает public
конструкторов внутри Enum, что заставляет объявлять
экземпляры Enum внутри себя.

16.

Вопрос 8
Какая разница сравнивать Enum при помощи == или
метода equals()?

17.

Какая разница сравнивать Enum при
помощи == или метода equals()?
https://javarevisited.blogspot.com/2013/04/how-to-comparetwo-enum-in-java-equals.html

18.

Вопрос 9
Что делает метод ordinal() в Enum?

19.

Что делает метод ordinal() в
Enum?
Метод ordinal() (порядковый) возвращает порядок, в
котором экземпляры Enum обозначены внутри Enum.
Например, в DayOfWeek Enum, вы можете указать дни
по порядку:
public enum DayOfWeek{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,
SATURDAY, SUNDAY;
}
и если мы вызовем метод DayOfWeek.MONDAY.ordinal(),
он вернёт 0 - что значит первый экземпляр.

20.

Вопрос 10
Можно использовать Enum с TreeSet или TreeMap в
Java?

21.

Можно использовать Enum с
TreeSet или TreeMap в Java?
Enum наследует интерфейс Comparable, который
является главным требованием для использования в
упорядоченных коллекциях, как TreeSet и TreeMap.
Поскольку Enum по умолчанию наследует интерфейс
Comparable, он может использоваться с TreeSet и
TreeMap.

22.

Вопрос 11
Как связаны методы ordinal() и compareTo() в Enum?

23.

Как связаны методы ordinal() и
compareTo() в Enum?
compareTo() имитирует порядок, предоставляемый
методом ordinal(), являющийся естественным порядком
Enum.
Если коротко, Enum ограничивает сравнения в порядке
их объявления.
Так же, стоит помнить, что данные константы сравнимы
только с другими константами того же типа —
сравнение разных типов констант может привести к
ошибке компилятора.

24.

Вопрос 12
Можно ли использовать Enum в switch case?

25.

Можно ли использовать Enum в
switch case?
Да, вы можете.
Мало того, это одна из главных полезностей
использования Enum.
Enum и Switch отлично дополняют друг друга, в
особенности если Enum содержит небольшое
количество устойчивых констант, например, семь дней
недели, 12 месяцев года и т. д.

26.

Вопрос 13
Как получить все существующие значения в экземпляре
Enum?

27.

Как получить все существующие
значения в экземпляре Enum?
Метод values() возвращает массив всех констант Enum.

28.

Вопрос 14
Какие плюсы и минусы использования Enum в качестве
синглтона?

29.

Какие плюсы и минусы использования
Enum в качестве синглтона?
Enum предоставляет быстрый ярлык для воплощения
паттерна синглтона.
контролирует создание экземпляра,
безопасно сериализуется,
легко создать потокобезопасный синглтон с
использованием Enum.
Вам не нужно больше заботиться о двойной проверке
волатильности переменных.
Подробнее: https://javarevisited.blogspot.com/2012/07/why-

30.

Вопрос 15
Какая выгода использовать Enum вместо паттернов
перечисления int и перечисления String?

31.

Какая выгода использовать Enum вместо
паттернов перечисления int и перечисления
String?
С использованием Enum, мы получаем безопасность
типов, которые компилятор проверяет за нас.

32.

Вопрос 16
Как преобразовать String в Enum?

33.

Как преобразовать String в
Enum?
Преобразование Enum в String, осуществляется через
определиние фабричного метода в самом Enum,
который будет брать аргументы String и возвращать в
качестве Enum.
Подробнее: https://www.java67.com/2012/08/string-toenum-in-java-conversion.html

34.

Литература
https://javarush.ru/groups/posts/1353-15-voprosov-dljasobesedovanija-razrabotchikov-otnositeljhno-enum-vdzhave-s-otvetami
English     Русский Rules