Найти тему

Что такое when и с чем его едят?

Недавно с командой обсуждали when и я решила, что это отличная тема для новой статьи. :)

when — это удобная замена для if-else. Оно позволяет более красиво записывать проверки, когда у нас миллион условий. Плюс when может работать с переменными разных типов. Например, одновременно с котиками, собачками и деревьями.

Давайте сначала посмотрим на самый простой пример. Предположим, у нас есть котик Cat и у него есть параметр age. В зависимости от возраста котика мы хотим писать различные сообщения:

Смотрите как прикольно сгенерировал ChatGPT по описанию
Смотрите как прикольно сгенерировал ChatGPT по описанию

Тут мы используем when для проверки возраста котика. Заметьте, что внутри when мы используем различные проверки:

  • -> для сообщения для определенного возраста (0 лет, 1 год и 2 года)
  • in для проверки диапазона значений. Если котику от 3 до 10 лет, то будет сообщение "Этот котик еще молод и игрив".
  • else для всех остальных возрастов

Второй простой пример связан с перечислениями. Предположим, у нас есть Food с различными значениями: Fish, Meat, Milk и Vegetables. Мы хотим в зависимости от еды вывести различные сообщения.

-2

Также when может использоваться для проверки типа. Например, мы можем проверить, является ли переменная типом Int:

-3

Ещё один пример с проверкой типа. Допустим, у нас есть класс Animal с наследниками Cat и Dog. Мы можем использовать when для проверки типа животного и выполнения определенного действия в зависимости от типа:

-4

Здесь мы проверяем тип животного, переданного в функцию feedAnimal. Если это кошка, она мяукает; если собака, то лает; иначе просто издает звук.

Также можно использовать when для сравнения значений. Для этого нужно передать проверяемое значение в when, а затем внутри конструкции указать условия сравнения:

-5

Здесь мы проверяем значение переменной number.

  • Если оно равно нулю, то выводим сообщение "Number is zero".
  • Если значение находится в диапазоне от 1 до 10 включительно, выводим сообщение "Number is between 1 and 10".
  • В остальных случаях выводим сообщение "Number is either negative or greater than 10".

Конструкция when также поддерживает комбинацию условий, использование else, а также вложенные проверки.

Более сложный пример для любознательных:

-6

Как видите, внутрь when мы можем указать вообще любые условия и всё что хотим. Плюс не обязательно писать when(parameter). Можно просто сделать when и указывать любые условия.

Почему разработчики так любят when и вечно поправляют джуниоров на Code Review?

Это особенно касается каких-то перечислений. Во многих компаниях есть строгое правило, что используем именно when (причём без варианта else), а не if-else. А всё потому что в будущем при добавлении нового типа when нам сразу выдаст ошибку и не даст собрать проект. Так мы точно не потеряем новый тип и добавим его во всех нужных местах. Если будем использовать if-else, то никаких ошибок не будет и мы можем просто потерять нового котика.

Бонусный вопрос: а есть break внутри when?

В Kotlin break используется только внутри циклов (например: for, while), поэтому не нужно использовать break внутри блока when. Но мы можем использовать слова return или continue.

Если нам нужно прервать выполнение when и перейти к следующему действию, то можно просто написать следующее действие после блока when.

Например, здесь when используется для определения типа животного и выполнения соответствующего действия:

-7

Здесь нет необходимости использовать break, потому что после выполнения блока when происходит выполнение следующего выражения println("Действие выполнено").

Например: мы передаём внутрь animalAction котика. Начинается блок when: идёт проверка, является ли наше животное собакой — нет, не является — является ли наше животное котиком? — да — выполняем animal.meow() — выходим из when — проверки для птички уже не будет — печатаем "Действие выполнено". Важно помнить, что как только внутри when найдётся подходящее условие, то дальше уже не будет проверяться, поэтому и break не нужен.

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. весь код помог сгенерировать ChatGPT. Получилось интересно. :)