Проверка null в Java: оба аргумента пустые или нет

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ: Применение булевой логики и битовых операций

Java
Скопировать код
boolean обаEitherNull = (объект1 == null) == (объект2 == null);

Данный логический прием позволяет установить, соответствуют ли объект1 и объект2 условию одновременного наличия или отсутствия значения. Если оба аргумента либо null, либо оба имеют значение, переменная обаEitherNull примет значение true.

Кинга Идем в IT: пошаговый план для смены профессии

Подробный разбор: Использование условных выражений

Иногда для читабельности кода требуется более детальное описание:

Java
Скопировать код
if (объект1 == null && объект2 != null) {
    throw new IllegalArgumentException("Первый объект отсутствует, а второй – присутствует. Время для кофе-брейка!");
}
if (объект1 != null && объект2 == null) {
    throw new IllegalArgumentException("Второй объект отсутствует, в то время как первый — присутствует.");
}

Такой код читается как открытая книга — он делает намерения программиста четкими и понятными.

Группа поддержки: Работа с запасными вариантами

Иногда нужно предвидеть альтернативные варианты:

Java
Скопировать код
Object безопасныйОбъект1 = объект1 != null ? объект1 : СТАНДАРТНЫЙ_ОБЪЕКТ1; // Альтернатива для объект1
Object безопасныйОбъект2 = объект2 != null ? объект2 : СТАНДАРТНЫЙ_ОБЪЕКТ2; // Альтернатива для объект2

Такой подход не только синхронизирует состояние объектов, но и обеспечивает им альтернативные значения при необходимости.

Раскрываем секреты магии: Инкапсуляция задачи

Если одна и та же операция встречается в коде часто, имеет смысл инкапсулировать её в метод:

Java
Скопировать код
public static void проверитьСовместимостьNull(Object а, Object b) {
    if ((а == null) ^ (b == null)) {
        throw new IllegalArgumentException("Один из объектов является null, а другой – нет.");
    }
}

проверитьСовместимостьNull(объект1, объект2);

Такой подход облегчит стандартизацию проверки на null.

На острие прогресса: Java 8 и новее

С появлением Java 8 стали возможны более элегантные стилистики:

Java
Скопировать код
boolean обаEitherNull = Objects.isNull(объект1) == Objects.isNull(объект2);

Для любителей новых подходов предлагается ссылка на метод:

Java
Скопировать код
Predicate<Object> isNull = Objects::isNull;
boolean обаEitherNull = isNull.test(объект1) == isNull.test(объект2);

Поддержание баланса: Изящество и ясность

В программировании важно уметь находить баланс между лаконичностью и понятностью кода. Минималистическое решение в одну строку может быть привлекательным, но иногда может сделать код слишком загадочным. Приоритет следует отдавать поддерживаемости и читабельности кода.

Визуализация

Markdown
Скопировать код
Аргумент А: [🕊] – Присутствует / [ ] – Отсутствует
Аргумент В: [🕊] – Присутствует / [ ] – Отсутствует

Список допустимых комбинаций:

Markdown
Скопировать код
Оба присутствуют:        [🕊][🕊] = 💕
Оба отсутствуют:         [ ][ ] = 💔
Один присутствует, другой отсутствует: [🕊][ ] = 💢

Вот такова реальность мира программирования!

Исключения и Ошибки: Послы неприятных новостей

Роль строгого судьи на себя берет RuntimeException:

Java
Скопировать код
boolean обаEitherNull = (объект1 == null) == (объект2 == null);
if (!обаEitherNull) {
    throw new RuntimeException("Нарушение правил: объект1 и объект2 должны быть либо оба null, либо оба не-null.");
}

Такое сообщение об ошибке служит отличным напоминанием о том, что что-то пошло не так.

Правильная номенклатура: Соглашения об именовании

При создании служебных методов рекомендуется использовать говорящие названия:

Java
Скопировать код
public static void гарантироватьСогласованностьNull(Object a, Object b) {...}

или

public static void проверитьЭквивалентностьNull(Object a, Object b) {...}

Избегание подводных камней: Сложные повороты

Стремитесь избегать сложных вложенных условных операторов. Цель – сделать код как можно проще и понятнее. Это не приключение в стиле Индианы Джонса — наша цель — линейность и очевидность кода.

Полезные материалы

  1. Objects (Java Platform SE 7) — Официальная документация по библиотеке Objects.equals().
  2. Expressions, Statements, and Blocks (Java Tutorials) — Руководство по выражениям в Java.
  3. Functional style of Java 8's Optional.ifPresent and if-not-Present? – Stack Overflow — Рекомендации по использованию Optional.
  4. Java 8 Lambdas – A Peek Under the Hood — Глубокий анализ лямбда-выражений.
  5. Java Ternary Operator — Объяснение тернарного оператора.
  6. DZone: Clean Code with Java 8 Optional — Рекомендации по написанию чистого кода с использованием Java 8.