Uso del operador condicional ternario en Java

Introducción



El operador condicional ternario ?: en Java permite definir expresiones de manera elegante y concisa. Se trata de una forma condensada de la sentencia if-else que también devuelve un valor. En esta entrada del blog, aprenderemos cuándo y cómo utilizar esta estructura ternaria, comenzando con su sintaxis y explorando sus diversas aplicaciones.



1. Overview

El operador condicional ternario ?: permite evaluar expresiones en Java. Se presenta en su forma más simple como booleanExpression ? expression1 : expression2, donde debe haber un primer operando de tipo booleana y otros dos operandos que pueden ser expresiones del mismo tipo o compatibles. La construcción ternaria devolverá expression1 si la condición es true, y expression2 si es false. Cabe destacar que tanto expression1 como expression2 deben ser expresiones que devuelvan un valor, no una declaración void. Para situaciones donde necesitamos ejecutar métodos sin retorno de valor, debemos utilizar una declaración if-else convencional.



Aquí puedes leer más sobre los controladores en Java: Control Structures in Java y sobre sentencias if-else en If-Else Statement in Java.



2. Sintaxis

La sintaxis del operador ternario es la siguiente:

booleanExpression ? expression1 : expression2

El primer operando necesita ser una expresión booleana. Las expresiones expression1 y expression2 deben ser compatibilidades tanto entre sí como con la variable donde se almacenará el resultado.



El operador ternario devuelve expression1 si el primer operando es evaluado como true, y expression2 si se evalúa como false.



3. Ventajas del operador ternario

  • Concisión: Nos permite escribir una declaración if-else en una sola línea de código, mejorando la legibilidad.
  • Inicialización concisa: Puede ser utilizado para inicializar variables final de forma más compacta.
  • Facilidad de depuración: La compactitud de su uso puede facilitar el establecimiento de puntos de ruptura y la revisión de resultados durante la depuración.
  • Uso directo en declaraciones de retorno: Puede ser utilizado sin problemas en una declaración return o en la inicialización de una variable.


4. Ejemplos de operador ternario

Tomemos un ejemplo básico de un constructo if-else:

int num = 8;
String msg = "";
if(num > 10) {
    msg = "Number is greater than 10";
} else {
    msg = "Number is less than or equal to 10";
}

Aquí, se asigna un valor a msg basado en la evaluación condicional de num. Ahora, veamos cómo este código puede ser más conciso utilizando un operador ternario.



4.1. Uso básico

Podemos reemplazar el anterior constructo if-else con una expresión ternaria:

int num = 8;
String msg = num > 10 
  ? "Number is greater than 10" 
  : "Number is less than or equal to 10";


4.2. Uso con variables final

El operador ternario es útil para inicializar una variable final:

final int num = 8;
final String msg = num > 10 
  ? "Number is greater than 10" 
  : "Number is less than or equal to 10";


4.3. Uso en declaraciones return

También podemos utilizar el operador ternario directamente en una declaración de return:

String checkNumber(int num) {
    return num > 10 
      ? "Number is greater than 10" 
      : "Number is less than or equal to 10";
}

En este ejemplo, definimos un método checkNumber() que usa un operador ternario en la declaración de return para devolver de inmediato un string basado en si num es mayor o no a 10.



4.4. Uso incorrecto

Es importante señalar que un operador ternario no deber ser utilizado para declaraciones que no devuelven un valor.

Por ejemplo, usar el siguiente código es incorrecto:

int num = 8;
num > 10 
  ? LOGGER.info("Number is greater than 10") 
  : LOGGER.info("Number is less than or equal to 10");

En este caso, LOGGER.info() es un método void, lo que invalida el uso del operador ternario.



5. Evaluación de expresiones

Cuando se utiliza una construcción ternaria en Java, solo se evalúa una de las expresiones de la derecha (ya sea expression1 o expression2) en tiempo de ejecución.

Veamos esto en un caso de prueba con JUnit:

@Test
public void whenConditionIsTrue_thenOnlyFirstExpressionIsEvaluated() {
    int exp1 = 0, exp2 = 0;
    int result = 12 > 10 ? ++exp1 : ++exp2;
    
    assertThat(exp1).isEqualTo(1);
    assertThat(exp2).isEqualTo(0);
    assertThat(result).isEqualTo(1);
}

En este caso, nuestra expresión booleana 12 > 10 siempre se evalúa como true, por lo que exp2 permanece sin cambios. Ahora consideremos lo que ocurre para una condición false:

@Test
public void whenConditionIsFalse_thenOnlySecondExpressionIsEvaluated() {
    int exp1 = 0, exp2 = 0;
    int result = 8 > 10 ? ++exp1 : ++exp2;

    assertThat(exp1).isEqualTo(0);
    assertThat(exp2).isEqualTo(1);
    assertThat(result).isEqualTo(1);
}

En este caso, exp1 no se modifica, y el incremento de exp2 se produce.



6. Ternario anidado

Se pueden anidar operadores ternarios hasta cualquier número de niveles. Aquí un rápido ejemplo:

String msg = num > 10 ? "Number is greater than 10" : 
  num > 5 ? "Number is greater than 5" : "Number is less than equal to 5";

Se sugiere el uso de paréntesis () donde sea necesario para mejorar la legibilidad:

String msg = num > 10 ? "Number is greater than 10" 
  : (num > 5 ? "Number is greater than 5" : "Number is less than equal to 5");

Sin embargo, no se recomienda el uso de construcciones ternarias profundamente anidadas en entornos reales, ya que esto puede reducir la legibilidad y dificultar el mantenimiento del código.



7. Conclusión

En este artículo, exploramos el operador ternario en Java. Aunque no es posible reemplazar todos los constructos if-else por un operador ternario, es una herramienta útil que condensa el código en situaciones adecuadas, mejorando la legibilidad en contextos específicos. Recuerda siempre considerar la claridad y mantenibilidad del código al emplear construcciones ternarias.



Para obtener más información sobre estructuras de control y cómo utilizar if-else en Java, no dudes en consultar nuestros recursos complementarios: