JavaRush /Java блог /Random UA /Тернарний оператор Java

Тернарний оператор Java

Стаття з групи Random UA
Вітання! Сьогоднішня лекція буде не дуже великою, але абсолютно точно корисною :) Ми поговоримо про так званий тернарний оператор . Тернарний оператор - 1"Тернарний" у перекладі означає "потрійний". Це альтернатива умовному оператору if-else, який тобі вже знайомий. Наведемо приклад. Припустимо, якась людина вирішила піти у кіно на фільм із рейтингом 18+. Охоронець перевіряє його вік на вході: якщо він проходить за віком – дозволяє пройти до зали, якщо ні – відправляє додому. Створимо клас Manі перевіримо це за допомогою if-else:
public class Man {

   private int age;

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

   public int getAge() {
       return age;
   }

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

   public static void main(String[] args) {

       Man man = new Man(22);

       String securityAnswer;

       if (man.getAge() >= 18) {
           securityAnswer = "Все гаразд, проходьте!";
       } else {
           securityAnswer = "Цей фільм не підходить для вашого віку!";
       }

       System.out.println(securityAnswer);

   }
}
Виведення в консоль:

"Все в порядке, проходите!"
Якщо вибрати висновок у консоль, наша перевірка виглядає так:
if (man.getAge() >= 18) {
           securityAnswer = "Все гаразд, проходьте!";
       } else {
           securityAnswer = "Цей фільм не підходить для вашого віку!";
       }
Тут, по суті, працює проста логіка: перевіряється одна умова (вік = 18). Залежно від цього змінну securityAnswerприсвоюється один із двох рядків з відповіддю охоронця. Такі ситуації, "одна умова - два можливі результати", зустрічаються в програмуванні дуже часто. Тому для них створабо цей тернарний оператор. З його допомогою ми можемо спростити нашу перевірку до одного рядка коду:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = (man.getAge() >= 18) ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";

   System.out.println(securityAnswer);

}
Так і виглядає робота цього оператора. Тернарним (потрійним) його називають тому, що в його роботі беруть участь 3 компоненти:
  • Одна умова ( man.getAge() >= 18)
  • Два можливі результати ( "Все в порядку, проходьте!" і "Цей фільм не підходить для вашого віку!" )
Спочатку в коді записується умова, після якої ставиться знак запитання.
man.getAge() >= 18 ?
"Вік людини більше або дорівнює 18?" Далі слідує перший результат. Він спрацьовує у разі, якщо умова повертає true, тобто є істинною:
String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!"
Вік людини більше чи дорівнює 18? Якщо так - присвоїти змінній securityAnswer значення "Все в порядку, проходьте!" . Далі слідує оператор “ :”, після якого записується другий результат. Він спрацьовує у разі, якщо умова повертає false, тобто є хибним:
String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";
Вік людини більше чи дорівнює 18? Якщо так - присвоїти змінній securityAnswer значення "Все в порядку, проходьте!" . Якщо ні - присвоїти змінної securityAnswer значення "Цей фільм не підходить для вашого віку!" Отак і виглядає загальна логіка тернарного оператора. умова? результат 1: результат 2 Тернарний оператор - 2До речі, дужки навколо умови ставити не обов'язково: ми зробабо це для більшої читальності. Спрацює і без них:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";

   System.out.println(securityAnswer);

}
Що ж використовувати: if-else, або тернарний оператор? З погляду продуктивності особливої ​​різниці немає. Точніше, може вона є, але незначна. Тут питання стосується швидше читання твого коду. Він дуже важливий у програмуванні: код, який ти пишеш, має не тільки коректно працювати, а й легко читатись. Адже він може перейти “у спадок” до інших програмістів, твоїх колег! І якщо він буде важким для розуміння, це ускладнить і їхню роботу, і твою – саме до тебе вони бігатимуть за поясненнями кожні 5 хвабон. Загальна рекомендація може звучати так: якщо умова проста та легко перевіряється, можна без шкоди використовувати тернарний оператор. Таким чином ти скоротиш обсяг коду та кількість перевірокif-else, яких там і так може бути чимало. А от якщо умова є складною та багатоступінчастою — краще використовувати if-else. Наприклад, у цьому випадку використовувати тернарний оператор буде поганою ідеєю:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild())  ? "Проходьте!" : "Ви не можете пройти!";
Так і не зрозумієш, що тут відбувається! Код став дуже складним для читання. А все через складні умови:
  • Якщо людині більше або дорівнює 18 років + у неї є квиток (або має купон на безкоштовне відвідування) + з нею немає маленьких дітей - тоді вона може пройти.
  • Якщо хоч одна з частин умови повертає false — тоді не може.
Ось тут явно краще б підійшло використання if-else. Так, наш код став би більшим у розмірах, але він був би в рази більш читаним. І ніхто з колег не схопиться за голову, якщо такий код дістанеться йому у спадок :) Насамкінець можу порекомендувати тобі книгу. Ми торкнулися лекції теми читання коду. Їй присвячена книга "Чистий код" Роберта Мартіна, що стала класикою. Тернарний оператор - 3У ній зібрані кращі практики та рекомендації для програмістів, які дозволять тобі писати не тільки працюючий, але й код, що легко читається. Огляд цієї книги є JavaRush.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ