TGViewer
Java: fill the gaps Java: fill the gaps @java_fillthegaps · 12.3K subscribers
Post #291 5.18K
Почему в java нет Elvis оператора?

Элвис оператор ?: — популярная конструкция, которая используется в Groovy, Kotlin, C# и других языках, но не в java. В этом посте мы обсудим, почему так получилось и чем java отличается от Kotlin.

Часть 1: обзор операторов

Элвис оператор ?: используется следующим образом:
String src = …
String x = src ?: "default";

▫️Если
src равен null, то x = "default"
▫️Если src НЕ равен null, то x = src

По сути это сокращённая форма тернарного оператора:
String x = src==null ? src : "default"

Есть два оператора, которые похожи на элвис:
🔸 ?. (с точкой) — null-safe member selection operator
str?.toString()
= если str не равен null, то вызвать метод toString()

🔸 ?[] — null-safe array access
lines?[6]
= если массив lines существует, то прочитать 6 элемент

Все операторы неплохо соединяются между собой:
String aMember = g?.members?[0]?.name ?: "nobody";

Но элвис оператор это только ?:

В java таких конструкций нет. Иногда это используют как аргумент того, что джава неудобная и несовременная.

На самом деле элвис оператор мог появиться уже в java 7. Пользователи java 5 называли элвис самой ожидаемой фичей. Но он не попал в итоговый релиз.

Давайте разберём, почему в java элвис оператор так и не появился, а в котлине, другом JVM языке, он есть.

Часть 2: зачем нужен null

Цель элвис оператора — облегчить работу с null. Значение null в джава коде выступает в двух ролях:

1️⃣ Ожидаемое значение и часть бизнес-логики

Поле необязательное или ещё не готово. Разработчик знает об этом заранее и учитывает в коде.

Элвис оператор прекрасно подходит для этого сценария.

2️⃣ Индикатор ошибки

Что-то пошло не так: пропущен обязательный параметр, соединение с БД оборвалось, инициализация не завершилась. Получаем NullPointerException, разбираемся с причинами и устраняем ошибку.

Здесь элвис оператор замаскирует проблему и сделает только хуже. Ошибка прикроется значением по умолчанию и пройдёт мимо нас.

Часть 3: Kotlin

Котлин использует другой подход: по умолчанию переменные НЕ могут быть null. Свойство nullability задаётся явно — через вопросик:

var str: String? = "abc"

Все null значения под чётким контролем. Поэтому элвис оператор не скрывает ошибок, а помогает писать лаконичный код. Захотели nullability — чётко это обозначили. Хотим избавиться от этого свойства — используем элвис оператор.

Часть 4: Optional

В java 8 появился способ явно указать, что значение может быть пустым — класс Optional. Метод orElse выполняет функции элвис оператора: если внутри Optional ничего нет, то возвращается значение внутри orElse.

Итог

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

После появления Optional нулл в коде почти всегда указывает на ошибку. Использовать элвис оператор в такой ситуации - нецелесообразно, поэтому маловероятно, что он появится в будущих версиях java.
  • 👍 5
More from @java_fillthegaps
  1. Apr 30, 2026Get Your Hands Dirty on Clean Architecture: отзыв на книгу Когда я подняла тему чистой арх…
  2. Apr 27, 2026​Clean Architecture: отзыв на книгу Наконец-то дочитала книгу Clean Architecture Роберта М…
  3. Mar 4, 2026Как переиспользовать контекст в интеграционных тестах Сегодня расскажу базовый минимум для…
  4. Mar 4, 2026Post #660
  5. Mar 4, 2026Тестовый контекст поднимается 2 минуты. У нас 4 класса с интеграционными тестами, их конфи…
  6. Feb 25, 2026Чистая архитектура. Главы 3-5 Продолжаем спидран по Clean Architecture Роберта Мартина. ⭐️…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →