Elvis Operator: qué es, sintaxis y manejo de valores null

Autor: IT Sectr Publicado: 2026-05-27 Tiempo de lectura: 8 min

Elvis Operator es un operador binario que devuelve el operando izquierdo si no es null, y el derecho en caso contrario. Se escribe como ?: en Kotlin, Groovy y algunos otros lenguajes. Según la Documentación del Lenguaje Kotlin, 2024, el operador forma parte del sistema de seguridad contra null del lenguaje y permite acortar las construcciones condicionales a una sola línea sin perder legibilidad. A diferencia de una expresión if-else completa, el Elvis Operator evalúa la parte derecha solo cuando el lado izquierdo es null, lo que ofrece una ventaja de rendimiento al usar expresiones predeterminadas costosas.

Puntos Clave

  • Elvis Operator — el operador ?:, que devuelve el primer operando no null de dos
  • Null safety — el área de aplicación clave del Elvis Operator en Kotlin y otros lenguajes
  • Sintaxis extremadamente concisa: val result = a ?: b, equivalente a if (a != null) a else b
  • Groovy usa la misma sintaxis ?:, Swift usa el operador ??, Dart usa ??
  • Logging mediante el Elvis Operator es un patrón popular: val name = input ?: "default"

Qué es el Elvis Operator

Elvis Operator es un operador binario nombrado en honor al peinado de Elvis Presley. El símbolo ?: se asemeja visualmente al rostro del cantante de perfil: el signo de interrogación es el ojo y la patilla, los dos puntos son la boca. El operador toma dos operandos: si el primero no es null — se devuelve ese, de lo contrario se devuelve el segundo. Esto permite reemplazar una construcción if-else completa con una sola expresión corta.

Origen del nombre

El nombre “Elvis Operator” se consolidó en las comunidades de Kotlin y Groovy, y luego se extendió a Xtend y otros lenguajes JVM. En Swift y Dart, la construcción análoga se llama nil-coalescing operator, pero es funcionalmente idéntica. La asociación visual con Elvis Presley ayudó a que el operador se convirtiera en uno de los símbolos más reconocibles en la sintaxis de los lenguajes de programación modernos.

Rol en el manejo de null

El Elvis Operator es parte del sistema de null safety que previene NullPointerException (NPE). Según un estudio de JetBrains de 2023, NPE representa el 28% de todas las excepciones en código JVM en producción. El uso del Elvis Operator elimina completamente NPE en el punto de asignación, garantizando un valor predeterminado. En combinación con el operador de llamada segura ?., se crea una cadena confiable sin un solo bloque if.

Sintaxis del Elvis Operator en Kotlin

En Kotlin, el Elvis Operator se escribe como ?: entre dos expresiones. Si la expresión izquierda no es null — el resultado es igual a la expresión izquierda, de lo contrario se evalúa la derecha. La expresión derecha se evalúa de forma perezosa — solo cuando el operando izquierdo es null, lo que es importante para el rendimiento al usar cálculos costosos o llamadas a API.

kotlin
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: $timeout")

// Elvis con throw para parámetros obligatorios
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")

// Elvis con return para salida temprana
fun process(data: String?): Result {
    val safe = data ?: return Result.failure("No data")
    return processInternal(safe)
}

Combinación con let es un patrón común en Kotlin, donde el Elvis Operator proporciona un valor predeterminado y let ejecuta una acción sobre el resultado no nulo. Este enfoque reemplaza bloques if-else enteros con una sola cadena de llamadas sin perder legibilidad. El Elvis Operator también se puede usar con throw para abortar forzosamente cuando falta un parámetro obligatorio — esta es una forma idiomática de validar datos de entrada.

Elvis con retorno anticipado de una función

Un patrón común en Kotlin es Elvis + return. Si el valor es null, la función devuelve inmediatamente un resultado o lanza una excepción. El idioma Elvis con return se usa a menudo en funciones de transformación de datos: val processed = rawData ?: return defaultValue. Esto es más compacto que guard let de Swift y no aumenta la anidación del código.

Elvis Operator vs if-else: Comparación

Elvis Operator es más corto que if-else y no requiere repetir la variable. Compare: val x = a ?: b versus val x = if (a != null) a else b. Con expresiones complejas, la reducción de código alcanza el 60%, mientras que la semántica es completamente idéntica — el compilador puede generar el mismo bytecode para ambas variantes.

CriterioElvis Operatorif-else
Longitud1 línea, 5–10 caracteres3 líneas, 15–30 caracteres
Repetición de expresiónNoSí (a != null) ? a : b
Lado derecho perezosoSí (elvis es más corto)
Efectos secundariosSolo en el lado derechoEn ambas ramas
LegibilidadAlta para casos simplesMejor para lógica compleja

Cuándo usar el Elvis Operator

El Elvis Operator es óptimo para asignar valores predeterminados, encadenar llamadas a funciones con acceso seguro y registrar valores faltantes. Los patrones idiomáticos de Kotlin lo recomiendan como reemplazo de if-else para comprobaciones simples de null en expresiones. Combinado con ?., produce cadenas compactas sin variables temporales.

Cuándo if-else es preferible

if-else sigue siendo preferible para múltiples condiciones, cuando se necesitan ejecutar efectos secundarios o cuando ambos operandos son bloques de código complejos con varias operaciones. El Elvis Operator no admite bloques anidados — solo expresiones individuales para cada operando. Si el lado derecho llama a una función con efectos secundarios, la legibilidad de if-else es mayor.

Elvis Operator en otros lenguajes de programación

Groovy usa exactamente la misma sintaxis ?: que Kotlin, ya que ambos lenguajes funcionan en la JVM y comparten la filosofía de null-safety. El operador apareció antes en Groovy — ha estado en el lenguaje desde la versión 1.8, lanzada en 2011. Groovy también admite la asignación Elvis: x ?= value (asignar solo si x es null).

groovy
def name = getUserName()
def display = name ?: "Guest"

def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)

// Asignación Elvis en Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"

En Swift, el equivalente se llama nil-coalescing operator y se escribe como ??. En Dart se usa la misma sintaxis ??. La diferencia es que Swift y Dart requieren que los tipos de los operandos coincidan, mientras que Kotlin permite tipos diferentes con conversión automática a un supertipo común. En TypeScript, el operador ?? (nullish coalescing) apareció en la versión 3.7 y funciona solo con null y undefined, a diferencia de || que filtra todos los valores falsy. En PHP, el operador ?? apareció en la versión 7.0, en C# — ?? desde la versión 6.0.

Errores comunes con el Elvis Operator

El error más frecuente es confundir el Elvis Operator ?: con el operador de llamada segura ?. En Kotlin, ?. llama a un método o propiedad solo si el objeto no es null, mientras que ?: devuelve un valor predeterminado cuando es null. Se combinan secuencialmente, pero cada uno cumple su propia función. La confusión surge entre los principiantes que intentan usar ?: sin ?. delante.

Efectos secundarios en el operando derecho

La parte derecha de Elvis se evalúa de forma perezosa, pero si contiene una llamada a una función con efectos secundarios, puede provocar un comportamiento inesperado. Los desarrolladores a veces colocan cálculos costosos o registro de eventos en el lado derecho, que no se ejecuta cuando el valor no es nulo. Es importante recordar que el lado derecho es una expresión que se evalúa solo cuando es necesario.

Elvis encadenados sin agrupación

Varios Elvis seguidos pueden dificultar la lectura del código. Por ejemplo, a ?: b ?: c ?: d se evalúa de izquierda a derecha, devolviendo el primer no nulo. La agrupación con paréntesis o la extracción de la lógica en una función separada mejora la legibilidad y la depuración. Si la cadena tiene más de 3 elementos, se debe usar una expresión when o una función auxiliar.

Elvis en lugar de if-else con condiciones booleanas

Los desarrolladores principiantes a veces intentan usar el Elvis Operator para comprobar valores booleanos: val x = flag ?: false. Esto solo funciona si flag puede ser null. Para condiciones booleanas sin null, se necesita un if-else normal o un operador ternario — Kotlin no tiene operador ternario, pero se reemplaza por la expresión if-else: val x = if (flag) a else b.

Preguntas Frecuentes

¿En qué se diferencia el Elvis Operator del operador ternario?

Elvis Operator solo verifica si hay null, mientras que el operador ternario acepta cualquier condición booleana. Kotlin no tiene operador ternario — se reemplaza por la expresión if-else. Elvis resuelve una tarea específica: un valor predeterminado cuando hay null, mientras que el operador ternario cubre todas las expresiones condicionales.

¿Se puede usar el Elvis Operator con funciones?

Sí, el lado derecho puede ser una llamada a función: val x = a ?: calculateDefault(). La función se evalúa solo cuando a es null gracias a la evaluación perezosa. Esto permite usar cálculos costosos, llamadas a API o consultas a bases de datos sin pérdida de rendimiento cuando hay un valor presente.

¿Existe el Elvis Operator en Java?

Java no tiene un Elvis Operator directo. A partir de Java 8, se puede usar Optional.ofNullable(value).orElse(default). Java 14+ introdujo expresiones switch, pero un ?: completo está ausente. Kotlin y Groovy lo proporcionan como una construcción sintáctica incorporada del lenguaje.

¿Cómo funciona el Elvis Operator con cadenas de llamadas?

El patrón típico es una llamada segura ?. seguida de Elvis. Ejemplo: user?.address?.city ?: “Unknown”. Si algún elemento de la cadena es null — se devuelve el valor predeterminado. Es un reemplazo compacto para las comprobaciones if anidadas, que reduce el código de 3 a 5 veces en comparación con el enfoque tradicional.

¿Cuál es la diferencia entre el Elvis Operator y orElse en Optional?

Elvis Operator es una construcción sintáctica a nivel del lenguaje, mientras que orElse es un método de Optional en Java. Elvis es perezoso (el lado derecho se evalúa solo cuando es null), mientras que orElse siempre evalúa su argumento. Para una variante perezosa en Java, existe orElseGet, que acepta un Supplier. Elvis es más corto y no requiere crear un Optional.

Resumen

  • Elvis Operator — el operador ?: para proporcionar un valor predeterminado cuando el operando es null
  • Sintaxis en Kotlin y Groovy: val result = a ?: b, donde b se evalúa solo cuando a == null
  • Null safety — el área de aplicación principal, que previene NullPointerException
  • Nil-coalescing — el equivalente en Swift (??) y Dart (??) con semántica similar, en TypeScript — ?? desde la versión 3.7
  • Combinación con la llamada segura ?. produce una cadena compacta de manejo de null sin anidación
  • Evaluación perezosa del operando derecho — una diferencia clave con el operador ternario
  • Mejor práctica — usar para comprobaciones simples de null, evitar en bloques complejos con efectos secundarios

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también