ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Оператор замены null в Java, аналог C# оператора ??

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

Быстрый ответ

В Java нет прямого эквивалента оператору ?? из C#. Тем не менее, подобную функциональность можно имитировать с помощью тернарного оператора ( ? : ):

Java
Скопировать код
String output = (yourVariable != null) ? yourVariable : "defaultVal";

В этом примере переменной output будет присвоено значение yourVariable, если оно не равно null. В противном случае будет применено значение "defaultVal".

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Сопротивление null-значениям с помощью распространенных библиотек Java

Несмотря на отсутствие встроенного механизма в Java, аналогичного тому, что есть в C#, существуют библиотеки, предоставляющие схожую функциональность:

  • Guava:
Java
Скопировать код
import com.google.common.base.MoreObjects;
String output = MoreObjects.firstNonNull(yourVariable, "defaultVal");
  • Apache Commons Lang:
Java
Скопировать код
import org.apache.commons.lang3.ObjectUtils;
String output = ObjectUtils.firstNonNull(yourVariable, "defaultVal");

Применение статических вспомогательных методов для повышения ясности кода

Еще один способ эффективно обрабатывать переменные, которые могут содержать null-значения – это создание статических вспомогательных методов:

Java
Скопировать код
public static <T> T coalesce(T... vals) {
    for (T value : vals) {
        if (value != null) {
            return value;
        }
    }
    return null;
}

Такие методы можно вызывать статически, что упрощает их многократное использование:

Java
Скопировать код
import static your.package.NullityUtility.coalesce;

String output = coalesce(variable, "defaultVal");

Но будьте осторожны: этот метод может выполнить больше вычислений, чем необходимо, что может отрицательно сказаться на производительности.

Углубление в класс Optional в Java

Класс Optional, появившийся начиная с Java 8, является удачным способом обеспечения безопасности при работе со значениями, которые могут быть null:

Java
Скопировать код
String output = Optional.ofNullable(yourVariable).orElse("defaultVal");

Для обработки сценариев с вложенными проверками на null можно использовать ссылки на методы вместе с Optional:

Java
Скопировать код
String countryCode = Optional.ofNullable(person)
                             .flatMap(Person::getAddress)
                             .flatMap(Address::getCountry)
                             .flatMap(Country::getCode)
                             .orElse("Unknown Code");

Использование Optional имеет смысл, когда оно добавляет семантику, однако его избыточное применение может усложнить код.

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

Давайте визуализируем принцип работы тернарного оператора:

УсловиеРезультат
yourVariable не равна null (✅)вывод yourVariable
yourVariable равна null (❌)"defaultValue"

Альтернативный сценарий с Optional выглядит следующим образом:

Java
Скопировать код
String output = Optional.ofNullable(yourVariable).orElse("defaultValue");

По аналогии:

  • Если есть электричество (✅), то генератор не нужен.
  • Если нет электричества (❌), то включается генератор (🔋).

Производительность в учете

Важно помнить о балансе между производительностью и читаемостью кода. Вспомогательные методы и класс Optional могут улучшить читаемость, но они могут привести к дополнительной нагрузке на производительность. Старайтесь минимизировать избыточные проверки на null там, где это критично для быстродействия программы.

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

  1. Тернарные операторы (учебные материалы Java™) — объяснение использования тернарных операторов в Java для проверок null.
  2. Использование Optional должно быть правильным — иначе нет смысла – DZone — об основных аспектах применения класса Optional.
  3. Objects (Платформа Java SE 7) — документация метода requireNonNull(), применяемого для проверок на null.
  4. Тернарный оператор Java (GeeksforGeeks) — различные примеры использования тернарного оператора.
  5. Способы обеспечения безопасности программирования от null в Java — обсуждение методик безопасного программирования с учетом null-значений в Java.