1. Въведение
В инструкциите if-else на Java можем да предприемем определено действие, когато изразът е истина , и алтернатива, когато е невярно . В този урок ще научим как да обърнем логиката с помощта на оператора not .
2. ако-друго S tatement
Нека започнем с едно просто изказване if-else :
boolean isValid = true; if (isValid) { System.out.println("Valid"); } else { System.out.println("Invalid"); }
Ами ако нашата програма трябва да се справи само с отрицателния случай? Как бихме пренаписали горния пример?
Една от опциите е просто да премахнете кода в блока if :
boolean isValid = true; if (isValid) { } else { System.out.println("Invalid"); }
Обаче празен блок if изглежда, че може да е непълен код, и изглежда дълъг начин за обработка само на отрицателното състояние. Вместо това бихме могли да опитаме да тестваме, ако нашият логически израз изчисли на false :
boolean isValid = true; if (isValid == false) { System.out.println("Invalid"); }
Горната версия е сравнително лесна за четене, макар че може да е по-трудно да се направи, ако логическият израз е по-сложен. Java обаче има алтернатива за нас под формата на оператора not :
boolean isValid = true; if (!isValid) { System.out.println("Invalid"); }
3. Не оператор
Операторът not е логичен оператор, представен в Java от ! символ. Това е единствен оператор, който приема логическа стойност като свой операнд. Операторът not работи, като инвертира (или отрича) стойността на своя операнд .
3.1. Прилагане на оператора not към булева стойност
Когато се прилага към булева стойност, операторът not превръща true в false и false в true .
Например:
System.out.println(!true); // prints false System.out.println(!false); // prints true System.out.println(!!false); // prints false
3.2. Прилагане на оператора not към булев израз
Тъй като not не е унарен оператор, когато искате да не резултатът от израз, трябва да заобиколите този израз в скоби, за да получите правилния отговор. Изразът в скобата се оценява първо и след това операторът not обръща резултата си.
Например:
int count = 2; System.out.println(!(count > 2)); // prints true System.out.println(!(count <= 2)); // prints false
boolean x = true; boolean y = false; System.out.println(!(x && y)); // prints true System.out.println(!(x || y)); // prints false
Трябва да отбележим, че когато се отрича изразът, влизат в сила законите на Де Морган. С други думи, всеки член в израза се отрича и операторът се обръща. Това може да ни помогне да опростим по-трудни за четене изрази.
Например:
!(x && y) is same as !x || !y !(x || y) is same as !x && !y !(a <3 && b == 10) is same as a>= 3 || b != 10
4. Някои често срещани клопки
Използването на оператора not понякога може да наруши четливостта на нашия код. Отрицателните могат да бъдат по-трудни за разбиране от положителните. Нека разгледаме някои примери.
4.1. Двойни отрицания
Тъй като операторът not е отрицателен оператор, използването му с променливи или функции, които имат отрицателно име, може да доведе до труден за четене код. Това е подобно на естествените езици, където двойните негативи често се считат за трудни за разбиране.
Например:
if (product.isActive()) {...}
чете по-добре от
if (!product.isNotActive()) {...}
Въпреки че нашият API може да не предоставя метод isActive , ние можем да създадем такъв, за да улесним четливостта.
4.2. Сложни условия
Операторът not понякога може да направи и без това сложен израз още по-труден за четене и разбиране. Когато това се случи, можем да опростим кода чрез обръщане на условието или чрез извличане на методи. Нека разгледаме някои примери за усложнения, усложнени от оператора not и как можем да ги опростим, като обърнем условието:
if (!true) // Complex if (false) // Simplified if (!myDate.onOrAfter(anotherDate)) // Complex if (myDate.before(anotherDate)) // Simplified if (!(a >= b)) // Complex if (a = 10 || total >= 1000)) // Complex if (count < 10 && total < 1000) // Simplified
5. Заключение
В тази статия обсъдихме оператора not и как може да се използва с булеви стойности, изрази и в if-else изрази.
Разгледахме и някои често срещани клопки, причинени от писането на изрази в обратната им страна и как да ги поправим.
Както винаги изходният код за примерите, използвани в тази статия, е достъпен в GitHub.