Проверка null в Java: оба аргумента пустые или нет
Быстрый ответ: Применение булевой логики и битовых операций
boolean обаEitherNull = (объект1 == null) == (объект2 == null);
Данный логический прием позволяет установить, соответствуют ли объект1
и объект2
условию одновременного наличия или отсутствия значения. Если оба аргумента либо null
, либо оба имеют значение, переменная обаEitherNull
примет значение true
.
Подробный разбор: Использование условных выражений
Иногда для читабельности кода требуется более детальное описание:
if (объект1 == null && объект2 != null) {
throw new IllegalArgumentException("Первый объект отсутствует, а второй – присутствует. Время для кофе-брейка!");
}
if (объект1 != null && объект2 == null) {
throw new IllegalArgumentException("Второй объект отсутствует, в то время как первый — присутствует.");
}
Такой код читается как открытая книга — он делает намерения программиста четкими и понятными.
Группа поддержки: Работа с запасными вариантами
Иногда нужно предвидеть альтернативные варианты:
Object безопасныйОбъект1 = объект1 != null ? объект1 : СТАНДАРТНЫЙ_ОБЪЕКТ1; // Альтернатива для объект1
Object безопасныйОбъект2 = объект2 != null ? объект2 : СТАНДАРТНЫЙ_ОБЪЕКТ2; // Альтернатива для объект2
Такой подход не только синхронизирует состояние объектов, но и обеспечивает им альтернативные значения при необходимости.
Раскрываем секреты магии: Инкапсуляция задачи
Если одна и та же операция встречается в коде часто, имеет смысл инкапсулировать её в метод:
public static void проверитьСовместимостьNull(Object а, Object b) {
if ((а == null) ^ (b == null)) {
throw new IllegalArgumentException("Один из объектов является null, а другой – нет.");
}
}
проверитьСовместимостьNull(объект1, объект2);
Такой подход облегчит стандартизацию проверки на null
.
На острие прогресса: Java 8 и новее
С появлением Java 8 стали возможны более элегантные стилистики:
boolean обаEitherNull = Objects.isNull(объект1) == Objects.isNull(объект2);
Для любителей новых подходов предлагается ссылка на метод:
Predicate<Object> isNull = Objects::isNull;
boolean обаEitherNull = isNull.test(объект1) == isNull.test(объект2);
Поддержание баланса: Изящество и ясность
В программировании важно уметь находить баланс между лаконичностью и понятностью кода. Минималистическое решение в одну строку может быть привлекательным, но иногда может сделать код слишком загадочным. Приоритет следует отдавать поддерживаемости и читабельности кода.
Визуализация
Аргумент А: [🕊] – Присутствует / [ ] – Отсутствует
Аргумент В: [🕊] – Присутствует / [ ] – Отсутствует
Список допустимых комбинаций:
Оба присутствуют: [🕊][🕊] = 💕
Оба отсутствуют: [ ][ ] = 💔
Один присутствует, другой отсутствует: [🕊][ ] = 💢
Вот такова реальность мира программирования!
Исключения и Ошибки: Послы неприятных новостей
Роль строгого судьи на себя берет RuntimeException
:
boolean обаEitherNull = (объект1 == null) == (объект2 == null);
if (!обаEitherNull) {
throw new RuntimeException("Нарушение правил: объект1 и объект2 должны быть либо оба null, либо оба не-null.");
}
Такое сообщение об ошибке служит отличным напоминанием о том, что что-то пошло не так.
Правильная номенклатура: Соглашения об именовании
При создании служебных методов рекомендуется использовать говорящие названия:
public static void гарантироватьСогласованностьNull(Object a, Object b) {...}
или
public static void проверитьЭквивалентностьNull(Object a, Object b) {...}
Избегание подводных камней: Сложные повороты
Стремитесь избегать сложных вложенных условных операторов. Цель – сделать код как можно проще и понятнее. Это не приключение в стиле Индианы Джонса — наша цель — линейность и очевидность кода.
Полезные материалы
- Objects (Java Platform SE 7) — Официальная документация по библиотеке
Objects.equals()
. - Expressions, Statements, and Blocks (Java Tutorials) — Руководство по выражениям в Java.
- Functional style of Java 8's Optional.ifPresent and if-not-Present? – Stack Overflow — Рекомендации по использованию
Optional
. - Java 8 Lambdas – A Peek Under the Hood — Глубокий анализ лямбда-выражений.
- Java Ternary Operator — Объяснение тернарного оператора.
- DZone: Clean Code with Java 8 Optional — Рекомендации по написанию чистого кода с использованием Java 8.