Как работает тернарный оператор в Java

🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!

В этой статье мы разберёмся, что такое тернарный оператор в Java и как с ним работать.

Тернарный — значит «состоящий из трёх частей». В Java тернарный оператор — это лаконичная замена обычному if-else.

Рассмотрим пример. Допустим, кто-то решил пойти на фильм с рейтингом R (для лиц младше 17 лет требуется сопровождение взрослого). Билетер проверяет возраст на входе: если возраст подходит — пускает, если нет — отправляет домой.

Объявим класс Person и реализуем такую проверку через if-else:

public class Person {

   private int age;

   public Person(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public static void main(String[] args) {

       Person person = new Person(22);

       String usherResponse;

       if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }

       System.out.println(usherResponse);

   }
}
Run Code

Вот что выведет программа:

"Everything is in order. Come in!"

Без вывода в консоль проверка выглядит так:

if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }
Run Code

Логика максимально проста: есть одно условие (age >= 18), и в зависимости от него переменной usherResponse присваивается одна из двух фраз — либо пускаем, либо разворачиваем домой.

Такие ситуации («одно условие — два варианта ответа») в программировании встречаются постоянно. Именно длятаких случаев и был создан тернарный оператор — с его помощью такую проверку можно сократить до одной строки кода:

public static void main(String[] args) {

   Person person = new Person(22);

   String usherResponse = (person.getAge() > 18) ? "Everything is in order. Come in!" : "This film is not suitable for your age!";

   System.out.println(usherResponse);

}
Run Code

Вот как работает тернарный оператор. Он называется тернарным, потому что состоит из трёх частей:

  • Одно условие (person.getAge() > 18)
  • Два возможных ответа ( "Everything is in order. Come in!" и This film is not suitable for your age!")

Сначала записывается условие, потом следует знак вопроса (?).

person.getAge() > 18 ?
Run Code

Вопрос звучит так: “Возраст этого человека больше 18 лет?”

Затем указываем первое значение — оно используется, если условие выполнено (true):

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
Run Code

Если возраст человека больше 18, тогда переменная usherResponse получит значение "Everything is in order. Come in!".После этого ставим двоеточие (:) и указываем второе значение — оно подставляется, если условие ложно (false):

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
Run Code

Если человеку больше 18 лет, то переменной usherResponse присваивается строка "Everything is in order. Come in!". В противном случае — "This film is not suitable for your age!".

Общая схема работы тернарного оператора выглядит так: условие ? результат_если_да : результат_если_нет (см. рис.)

Схема работы тернарного оператора

Обратите внимание: скобки вокруг условия не обязательны — мы добавили их для лучшей читаемости. Оператор работает и без них:

public static void main(String[] args) {

   Person person = new Person(22);

   String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";

   System.out.println(usherResponse);

}
Run Code

Итак, что же стоит использовать? Оператор if-else или тернарный оператор?

С точки зрения производительности особой разницы нет. Хотя, возможно, она и существует, но она настолько мала, что на неё можно не обращать внимания.

Самое важное здесь — это читаемость кода.

Написанный вами код должен не только правильно работать, но и быть легким для восприятия. Вдруг его будут читать другие программисты, например, ваши коллеги! Если код сложно понять, это усложнит не только их работу, но и вашу тоже — к вам за объяснениями будут бегать каждые 5 минут.

Основной совет: если условие простое и легко проверяемое, можно смело использовать тернарный оператор. Это поможет уменьшить объем кода и количество операторов if-else (которые и так могут быть в коде в избытке).

Но если условие сложное и включает несколько шагов, лучше использовать оператор if-else. Например, в этом случае тернарный оператор — не лучший вариант:

String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
Run Code

Здесь не сразу понятно, что происходит, и код стал трудным для чтения. И все из-за сложного условия:

  • Если человек старше 18 лет, имеет билет (или бесплатный пропуск) и не имеет маленьких детей, он может войти.
  • Если хотя бы одно из этих условий не выполнено, то ему не разрешат войти.

Здесь явно лучше использовать оператор if-else. Да, код увеличится в размере, но он станет проще для восприятия. И ваши коллеги не будут разочарованы, если им придется работать с этим кодом 🙂

А на тему читаемости кода можем посоветовать прочитать книгу Роберта Мартина “Чистый код”. В ней собраны лучшие практики и рекомендации для программистов, которые помогут писать не только функциональный код, но и понятный для других.

Роберт Мартин "Чистый код"

Перевод статьи «Java Ternary operator».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх