Долго думал: чем блеснуть в статье – домашнем задании к базовому уровню 18 урока, ничего лучшего в голову не пришло, как составить тест для таких как я сам, по итогам базового уровня изучения в Progwards. Тест не трудный, особенно когда под рукой среда-компилятор, но, конечно он рассчитан на тот самый случай, когда ответить нужно без теста в среде разработки, а как на экзамене в ГИБДД, например, для учеников водителей, которые сдают правила движения по тестам с вариантами. В итоге я остановился на теме оператора SWITCH/CASE
, так как часто, когда сам мог его применить в решении задач, предложенных наставниками, почему- то старался использовать IF-ELSE
. Тесты ранее я не составлял, поэтому, вот решил попробовать.
Итак, в классе описан enum :
public class BestTest { enum Length { LONGEST, AVERAGE, MINIMUM ;}
И фрагмент кода:
public static void main(String[] args) { final var length = Length.AVERAGE; // line n1 switch (length) { // line n2 case AVERAGE: { System.out.print(length);} // line n3 } }
Выберите результат, один из:
1. Компилятор выдаст ошибку на уровне n1 из-за неправильного синтаксиса операции присваивания.
2. Компилятор выдаст ошибку на уровне n2, потому что, в указанной функции нет всех трех значений, отсутствуют LONGEST
и MINIMUM
.
3. Компилятор выдаст ошибку на уровне n3, потому что мы должны придерживаться «code style» значений имён (то есть) Length.AVERAGE
.
4. Функция возвратит значение AVERAGE
.
5. Функция возвратит значение Length@3cb5cdba.
Результаты:
Вариант 1 предполагает наличие синтаксической проблемы на уровне n1. Однако используемый здесь синтаксис правильный; локальная переменная может быть объявлена как final
, а в Java 10 тип локальной переменной может быть объявлен и как var
(есть некоторые ограничения, но здесь нет ни одного). В таком случае тип переменной выводится из типа выражения, назначенного для инициализации переменной. Третий элемент синтаксиса — это использование выражения Length.AVERAGE
. Но это совершенно правильно, даже если это краткая форма (просто AVERAGE
) также была бы правильной, если бы статический импорт сделал идентификатор доступным напрямую. С учетом этого уровень компилируется успешно и вариант 1 неверен.
Вариант 2 также предполагает сбой компиляции. На этот раз вариант прямо предлагает перечислить все три возможных случая. Этот довод безоснователен; в давно существующем операторе switch / case
не требуется предоставлять запись case для всех возможных значений управляющего выражения. Из-за этого компиляция этого уровня завершается успешно и вариант 2 неверен.
Вариант 3 также неверен; он предполагает, что после ключевого слова case следует полное имя Length.AVERAGE
. На самом деле, верно как раз обратное: когда константа enum
используется в выражении case
, она всегда должна использоваться в неквалифицированной, то есть в краткой форме.
Вариант 4 подразумевает метод toString
«по умолчанию» для типа перечисления. Когда мы объявляем тип перечисления, мы неявно определяем класс, расширяющий java.lang.Enum<E>
. Этот базовый класс реализует метод toString
, который печатает простое имя константы, как оно объявлено в источнике. В этом случае указанная функция возвратит AVERAGE
, и вариант 4 в итоге будет правильный. В качестве дополнительного примечания можно определить и переопределить методы в перечислимом типе, и, следовательно, метод toString
может быть переопределен, чтобы при желании обеспечить другой результат.
Вариант 5 неверен: как объяснялось выше в варианте 4, функция toString
по умолчанию для экземпляра перечисления возвращает простое имя константы. Следовательно, этот параметр, который предлагает возврат, напоминающий метод toString java.lang.Object
по умолчанию, неверен.
Итак правильный вариант 4.
Евгений, выпускник базового курса, январь 2021 года