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 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.
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.
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.
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.
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.
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 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.
| Criterio | Elvis Operator | if-else |
|---|---|---|
| Longitud | 1 línea, 5–10 caracteres | 3 líneas, 15–30 caracteres |
| Repetición de expresión | No | Sí (a != null) ? a : b |
| Lado derecho perezoso | Sí | Sí (elvis es más corto) |
| Efectos secundarios | Solo en el lado derecho | En ambas ramas |
| Legibilidad | Alta para casos simples | Mejor para lógica compleja |
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.
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.
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).
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Lea también