Elvis Operator — бинарни оператор који враћа леви операнд ако није null, а десни у супротном. Записује се као ?: у Kotlin, Groovy и неким другим језицима. Према Kotlin Language Documentation, 2024, оператор је део система null-безбедности језика и омогућава скраћивање условних конструкција на један ред без губитка читљивости. За разлику од пуног if-else записа, Elvis Operator израчунава десни део само када је лева вредност null, што даје предност у перформансама при коришћењу скупих израза подразумеване вредности.
Главне тачке
Elvis Operator — бинарни оператор назван по фризури Елвиса Преслија. Симбол ?: визуелно подсећа на лице певача са стране: знак питања — око и бакенбарди, две тачке — уста. Оператор прима два операнда: ако први није null — враћа се он, у супротном се враћа други. Ово омогућава замену комплетне if-else конструкције једним кратким записом.
Назив „Elvis Operator” учврстио се у заједници Kotlin и Groovy, а затим прешао у Xtend и друге JVM језике. У Swift и Dart слична конструкција се назива nil-coalescing operator, али је функционално идентична. Визуелна асоцијација са Елвисом Преслијем помогла је оператору да постане један од најпрепознатљивијих симбола у синтакси савремених програмских језика.
Elvis Operator је део система null safety који спречава NullPointerException (NPE). Према истраживању JetBrains из 2023. године, NPE чини 28% свих изузетака у продукцијском коду на JVM. Коришћење Elvis Operator потпуно елиминише NPE на месту доделе, гарантујући подразумевану вредност. У комбинацији са оператором безбедног позива ?. добија се поуздан ланац без иједног if блока.
У Kotlin Elvis Operator се записује као ?: између два израза. Ако леви израз није null — резултат је једнак левом, у супротном се израчунава десни. Десни израз се израчунава лењо — само када је леви операнд null, што је важно за перформансе при коришћењу скупих израчунавања или API позива.
val name: String? = getUserName()
val displayName = name ?: "Guest"
fun getLength(str: String?): Int {
return str?.length ?: 0
}
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Тајмаут: $timeout")
// Elvis са throw за обавезне параметре
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis са return за рани излазак
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Комбиновање са let — чест образац у Kotlin, где Elvis Operator поставља подразумевану вредност, а let извршава акцију са не-null резултатом. Овакав приступ замењује читаве if-else блокове једним ланцем позива без губитка читљивости. Elvis Operator се такође може користити са throw за присилни прекид када недостаје обавезни параметар — ово је идиоматски начин валидације улазних података.
У Kotlin је распрострањен образац Elvis + return. Ако је вредност null, функција одмах враћа резултат или баца изузетак. Идиом „Elvis with return” се често користи у функцијама трансформације података: val processed = rawData ?: return defaultValue. Ово је компактније од guard let у Swift и не повећава угнежђење кода.
Elvis Operator је краћи од if-else и не захтева понављање променљиве. Упоредите: val x = a ?: b наспрам val x = if (a != null) a else b. Код сложених израза, смањење кода достиже 60%, а семантика је потпуно идентична — компајлер може генерисати исти бајт-код за обе варијанте.
| Критеријум | Elvis Operator | if-else |
|---|---|---|
| Дужина записа | 1 ред, 5–10 знакова | 3 реда, 15–30 знакова |
| Понављање израза | Не | Да (a != null) ? a : b |
| Лењост десног дела | Да | Да (elvis краће) |
| Споредни ефекти | Само у десном делу | У обе гране |
| Читљивост | Висока за једноставне случајеве | Боља за сложену логику |
Elvis Operator је оптималан за доделу подразумеване вредности, позивање ланаца функција са безбедним приступом и логирање недостајућих вредности. Идиоматски обрасци Kotlin га препоручују као замену за if-else за једноставне null провере у изразима. У комбинацији са ?. даје компактне ланце без привремених променљивих.
if-else остаје пожељнији код вишеструких услова, када треба извршити споредне ефекте или када су оба операнда сложени кодни блокови са више операција. Elvis Operator не подржава угнежђене блокове — само појединачне изразе за сваки операнд. Ако десни део позива функцију са споредним ефектом, читљивост if-else је већа.
Groovy користи потпуно исту синтаксу ?: као Kotlin, јер оба језика раде на JVM и деле филозофију null-safety. У Groovy оператор се појавио раније — био је у језику од верзије 1.8, објављене 2011. године. Groovy такође подржава Elvis доделу: x ?= value (додели само ако је x null).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Elvis додела у Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
У Swift аналог се назива nil-coalescing operator и записује се као ??. У Dart се користи иста синтакса ??. Разлика је у томе што Swift и Dart захтевају подударање типова операнда, а Kotlin дозвољава различите типове са аутоматском конверзијом у заједнички супертип. У TypeScript од верзије 3.7 појавио се оператор ?? (nullish coalescing), који ради само са null и undefined, за разлику од || који филтрира све falsy вредности. У PHP од верзије 7.0 појавио се оператор ??, у C# — ?? од верзије 6.0.
Најчешћа грешка — мешање Elvis Operator ?: са оператором безбедног позива ?. У Kotlin ?. позива метод или својство само ако објекат није null, а ?: враћа подразумевану вредност при null. Комбинују се секвенцијално, али сваки обавља своју функцију. Забуна настаје код почетника који покушавају да користе ?: без ?. испред њега.
Десни део Elvis се израчунава лењо, али ако се у њему налази позив функције са споредним ефектима, то може довести до неочекиваног понашања. Програмери понекад постављају у десни део скупа израчунавања или логирање које се не извршава када вредност није null. Важно је запамтити да је десни део израз који се израчунава само по потреби.
Вишеструки Elvis у низу могу отежати читање кода. На пример, a ?: b ?: c ?: d се извршава слева надесно, враћајући први не-null. Груписање кроз заграде или издвајање логике у посебну функцију повећава читљивост и олакшава отклањање грешака. Ако је ланац дужи од 3 елемента, боље је користити when израз или помоћну функцију.
Програмери почетници понекад покушавају да користе Elvis Operator за проверу буловских вредности: val x = flag ?: false. Ово ради само ако flag може бити null. За буловске услове без null потребан је обичан if-else или тернарни оператор, који у Kotlin не постоји, али га замењује if-else израз: val x = if (flag) a else b.
Често постављана питања
Elvis Operator проверава само null, а тернарни оператор прихвата било који буловски услов. У Kotlin не постоји тернарни оператор — замењује га if-else израз. Elvis решава један конкретан задатак: подразумевану вредност при null, док тернарни оператор покрива све условне изразе.
Да, у десном делу може бити позив функције: val x = a ?: calculateDefault(). Функција се израчунава само када је a null захваљујући лењом израчунавању. Ово омогућава коришћење скупих израчунавања, API позива или упита бази података без губитка перформанси када вредност постоји.
У Java не постоји директни Elvis Operator. Од Java 8 може се користити Optional.ofNullable(value).orElse(default). У Java 14+ појавили су се switch изрази, али потпуни ?: недостаје. Kotlin и Groovy га пружају као уграђену синтаксну конструкцију језика.
Типични образац: safe call ?. затим Elvis. Пример: user?.address?.city ?: "Unknown". Ако је било који елемент ланца null — враћа се подразумевана вредност. Ово је компактна замена угнежђеним if проверама, која скраћује код 3–5 пута у поређењу са традиционалним приступом.
Elvis Operator је синтаксна конструкција на нивоу језика, orElse је метод Optional у Java. Elvis се извршава лењо (десни део се израчунава само при null), orElse увек израчунава аргумент. За лењу варијанту у Java постоји orElseGet, који прихвата Supplier. Elvis је краћи и не захтева креирање Optional.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође