Недавно с командой обсуждали when и я решила, что это отличная тема для новой статьи. :)
when — это удобная замена для if-else. Оно позволяет более красиво записывать проверки, когда у нас миллион условий. Плюс when может работать с переменными разных типов. Например, одновременно с котиками, собачками и деревьями.
Давайте сначала посмотрим на самый простой пример. Предположим, у нас есть котик Cat и у него есть параметр age. В зависимости от возраста котика мы хотим писать различные сообщения:
Тут мы используем when для проверки возраста котика. Заметьте, что внутри when мы используем различные проверки:
- -> для сообщения для определенного возраста (0 лет, 1 год и 2 года)
- in для проверки диапазона значений. Если котику от 3 до 10 лет, то будет сообщение "Этот котик еще молод и игрив".
- else для всех остальных возрастов
Второй простой пример связан с перечислениями. Предположим, у нас есть Food с различными значениями: Fish, Meat, Milk и Vegetables. Мы хотим в зависимости от еды вывести различные сообщения.
Также when может использоваться для проверки типа. Например, мы можем проверить, является ли переменная типом Int:
Ещё один пример с проверкой типа. Допустим, у нас есть класс Animal с наследниками Cat и Dog. Мы можем использовать when для проверки типа животного и выполнения определенного действия в зависимости от типа:
Здесь мы проверяем тип животного, переданного в функцию feedAnimal. Если это кошка, она мяукает; если собака, то лает; иначе просто издает звук.
Также можно использовать when для сравнения значений. Для этого нужно передать проверяемое значение в when, а затем внутри конструкции указать условия сравнения:
Здесь мы проверяем значение переменной number.
- Если оно равно нулю, то выводим сообщение "Number is zero".
- Если значение находится в диапазоне от 1 до 10 включительно, выводим сообщение "Number is between 1 and 10".
- В остальных случаях выводим сообщение "Number is either negative or greater than 10".
Конструкция when также поддерживает комбинацию условий, использование else, а также вложенные проверки.
Более сложный пример для любознательных:
Как видите, внутрь 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 используется для определения типа животного и выполнения соответствующего действия:
Здесь нет необходимости использовать break, потому что после выполнения блока when происходит выполнение следующего выражения println("Действие выполнено").
Например: мы передаём внутрь animalAction котика. Начинается блок when: идёт проверка, является ли наше животное собакой — нет, не является — является ли наше животное котиком? — да — выполняем animal.meow() — выходим из when — проверки для птички уже не будет — печатаем "Действие выполнено". Важно помнить, что как только внутри when найдётся подходящее условие, то дальше уже не будет проверяться, поэтому и break не нужен.
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes
P.S. весь код помог сгенерировать ChatGPT. Получилось интересно. :)