tgoop.com/java_fillthegaps/291
Create:
Last Update:
Last Update:
Почему в java нет Elvis оператора?
Элвис оператор ?: — популярная конструкция, которая используется в Groovy, Kotlin, C# и других языках, но не в java. В этом посте мы обсудим, почему так получилось и чем java отличается от Kotlin.
Часть 1: обзор операторов
Элвис оператор ?: используется следующим образом:
String src = …src равен null, то
String x = src ?: "default";
▫️Если
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.
BY Java: fill the gaps
Share with your friend now:
tgoop.com/java_fillthegaps/291