«1. Введение

В операторах if-else Java мы можем выполнить определенное действие, когда выражение истинно, и альтернативное, когда оно ложно. В этом уроке мы узнаем, как изменить логику с помощью оператора not.

2. Оператор if-else

Начнем с простого оператора 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 выглядит так, как будто это неполный код, и кажется многословным способом обработки только отрицательного условия. Вместо этого мы могли бы попробовать проверить, является ли наше логическое выражение ложным:

boolean isValid = true;

if (isValid == false) {
    System.out.println("Invalid");
}

Вышеупомянутая версия относительно легко читается, хотя это было бы сложнее сделать, если бы логическое выражение было более сложным. Однако в Java для нас есть альтернатива в виде оператора not:

boolean isValid = true;

if (!isValid) {
    System.out.println("Invalid");
}

3. Оператор not

Оператор 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. Сложные условия

if (!true) // Complex
if (false) // Simplified

if (!myDate.onOrAfter(anotherDate)) // Complex 
if (myDate.before(anotherDate))     // Simplified
 
if (!(a >= b)) // Complex
if (a < b)     // Simplified

if (!(count >= 10 || total >= 1000))  // Complex
if (count < 10 && total < 1000)       // Simplified

Оператор not иногда может сделать и без того сложное выражение еще более трудным для чтения и понимания. Когда это происходит, мы можем упростить код, обратив условие или извлекая методы. Давайте рассмотрим некоторые примеры условий, усложненных оператором not, и то, как мы можем упростить их, обратив условие:

5. Заключение

В этой статье мы обсудили оператор not и то, как его можно изменить. используется с логическими значениями, выражениями и операторами if-else.

Мы также рассмотрели некоторые распространенные ошибки, возникающие при написании выражений в обратном порядке, и способы их исправления.