Mejoras para Switch Statement en Java 13

Java 12 mejoró la declaración de cambio tradicional y la hizo más útil. Java 13 introdujo nuevas funciones. Antes de entrar en los detalles de las nuevas funciones, echemos un vistazo a los inconvenientes que enfrenta la declaración tradicional de Switch.

Problemas en Switch tradicional

1. Incumplimiento predeterminado debido a la falta de descanso

El comportamiento fallido predeterminado es propenso a errores. Entendámoslo con un ejemplo.

switch (itemCode) {
    case 001 : 
        System.out.println("It's a laptop!");
        break;
    case 002 :
        System.out.println("It's a desktop!");
        break;
    case 003 :
        System.out.println("It's a mobile phone!");
        break;
    default :
        System.out.println("Unknown device!");
}

El código anterior funciona haciendo coincidir el caso correspondiente y ejecutando el bloque de código particular. Siempre que proporcione las declaraciones de interrupción necesarias, funciona bien.

Pero, ¿qué sucede si olvidamos alguna de las declaraciones de ruptura requeridas?

 switch (itemCode) {
    case 001 : 
        System.out.println("It's a laptop!");
        // missed out break here 
    case 002 :
        System.out.println("It's a desktop!");
        break;
}

Aquí, si pasamos 001, el primer caso coincide y el bloque de código se ejecuta. Pero debido a la falta de un descanso, la ejecución falla y continúa para el caso 002 . Obtenemos la siguiente salida incorrecta:

It's a laptop!
It's a desktop!

Claramente, este no es el resultado previsto. Es el resultado de la pérdida accidental de declaraciones de ruptura.

2. Múltiples valores por caso no admitidos

Puede haber situaciones en las que se requiera un procesamiento similar para varios valores de casos. Pero el cambio tradicional hace seguir la caída a través del comportamiento.

case 001:
case 002:
case 003:
System.out.println("It's an electronic gadget!");

El interruptor muy mejorado acepta múltiples valores por caso.

case 001, 002, 003 : 
        System.out.println("It's an electronic gadget!");

Interruptor actualizado

Java 12 introdujo mejoras en las declaraciones de cambio y luego Java 13 las modificó.

Profundicemos en las características importantes de esta versión mejorada de la declaración Switch.

1. Admite múltiples valores por caso

Dado que se especifican múltiples valores por caso, simplifica la estructura del código y elimina la necesidad de utilizar fallas.

Los valores deben estar separados por comas y el descanso debe seguir al bloque de mayúsculas y minúsculas.

switch (itemCode) {
    case 001, 002, 003 : 
        System.out.println("It's an electronic gadget!");
        break;
        
    case 004, 005:
        System.out.println("It's a mechanical device!");
        break;
}

2. yield se utiliza para devolver un valor

Se ha introducido un nuevo rendimiento de palabra clave. Solo devuelve valores de una rama de conmutador. 

No necesitamos un descanso después del rendimiento, ya que termina automáticamente la expresión de cambio.

int val = switch (code) {
    case "x", "y" :
        yield 1;
    case "z", "w" :
        yield 2;
}

3. Cambiar se puede usar como una expresión

El interruptor ahora se puede usar como una expresión. Esto significa que el interruptor ahora puede devolver valores basados ​​en nuestra entrada. Hay un ligero cambio en la sintaxis del modificador para adaptarse a este cambio. Un bloque de interruptor debe estar delimitado por un punto y coma. La palabra clave yield se utiliza para devolver valores. No se requiere descanso con la declaración de rendimiento.

Echemos un vistazo a un fragmento de código para comprender mejor estos cambios.

String text = switch (itemCode) {
    case 001 : 
        yield "It's a laptop!";
    case 002 :
        yield "It's a desktop!";        
    case 003 :
        yield "It's a mobile phone!";
    default :
        throw new IllegalArgumentException(itemCode + "is an unknown device!");
}

4. Necesario para devolver valor/excepción

La expresión de cambio es necesaria para especificar el manejo de todos los valores de entrada posibles. O proporcionamos todos los casos posibles o especificamos el predeterminado. Esto significa que, independientemente del valor de entrada, la expresión de cambio siempre debe devolver algún valor o generar explícitamente una excepción.

Por ejemplo, si el bloque de código anterior se cambia a:

String text = switch (itemCode) {
    case 001 : 
        yield "It's a laptop!";
    case 002 :
        yield "It's a desktop!";        
    case 003 :
        yield "It's a mobile phone!";
    // default :
    //    throw new IllegalArgumentException(itemCode + "is an unknown device!");
}

Esto dará como resultado un error que indica que la expresión de cambio no ha cubierto todos los valores posibles.

5. Cambiar con flechas 

Se ha introducido la nueva sintaxis de flecha ⇾ para el conmutador. Se puede usar con el interruptor como una expresión y también como una declaración. 

Las declaraciones en el lado derecho de una se ejecutan si un caso exacto coincide en el lado izquierdo.

En el lado derecho de podemos tener cualquiera de los siguientes:

  • Declaración / expresión
  • lanzar declaración
  • {} bloquear

La principal ventaja de esta sintaxis es que no necesitamos una declaración de interrupción para evitar el error predeterminado. Entonces, la regla es, si necesitamos fallas, use el caso: de lo contrario, si no, use el caso . También tenga en cuenta que para todas las ramas de casos debe ser caso: o caso ⇾ . No pueden ser casos diferentes o diferentes en un interruptor, de lo contrario, resultará en un error.

switch (itemCode) {
    case 001 -> System.out.println("It's a laptop!");
    case 002 -> System.out.println("It's a desktop!");
    case 003,004 -> System.out.println("It's a mobile phone!");
}

Como podemos ver en el código anterior, la sintaxis también se puede usar para múltiples valores por caso. 

6. Alcance

Las variables declaradas en el interruptor tradicional existen hasta el final de la declaración del interruptor. Si queremos que las variables tengan un alcance de nivel de caso, podemos usar {} introducido por el interruptor mejorado en Java 13.

switch (errorCode) {
    case 101: {
        // This variable exists just in this {} block
        int num = 200;
        break;
    }
    case 300: {
        // This is ok, {} block has a separate scope
        int num = 300;
        break;
    }
}

7. Función de vista previa 

Después de profundizar en las funciones relacionadas con el cambio mejorado, el punto a destacar es que la funcionalidad del cambio mejorado está disponible solo como una función de vista previa en Java 13. Esto significa que no está habilitada de manera predeterminada. Para usarlo, necesitamos habilitarlo explícitamente.

En tiempo de compilación, agregue los siguientes parámetros a javac:

javac -- release 13 --enable-preview MyClass.java

En tiempo de ejecución, agregue lo siguiente:

java --enable-preview MyClass

El conmutador mejorado de Java 13 proporciona una serie de características impresionantes al conmutador tradicional. Sin embargo, todavía está en la fase de experimentación y aún no está diseñado para su uso en producción.

Publicación traducida automáticamente

Artículo escrito por nehagupta12 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *