Java7 : Nuevo soporte del tipo String en sentencias switch En la versión 7 de Java, el lenguaje ha sido modificado para poder soportar una variable String en una sentencia switch. Se trata de un cambio meramente estético ya que no supone más que sustituir un bloque if - else anidados por una sentencia switch. Código antiguo (aún soportado en Java7, por supuesto): String mes = null; if (mes == null) { System.out.println("Mes nulo."); } else if (mes.equals("Enero")||mes.equals("Febrero")|| mes.equals("Marzo")){ System.out.println("1er trimerstre"); } else if (mes.equals("Abril")||mes.equals("Mayo")|| mes.equals("Junio")) { System.out.println("2nd trimestre"); } else if (mes.equals("Julio")|| mes.equals("Agosto")|| mes.equals("Septiembre")) { System.out.println("3rd trimestre"); } else if (mes.equals("Octubre")||mes.equals("Noviembre")|| mes.equals("Diciembre")) { System.out.println("4th trimestre"); } else { System.out.println("Mes no válido."); } Código nuevo Java7 String mes = null; if (mes == null) { System.out.println("Mes nulo."); } else { switch (mes) { case "Enero": case "Febrero": case "Marzo": System.out.println("1er trimerstre "); break; case "Abril": case "Mayo": case "Junio": System.out.println("2nd trimestre"); break; case "Julio": case "Agosto": case "Septiembre": System.out.println("3rd trimestre"); break; case "Octubre": case "Noviembre": case "Diciembre": System.out.println("4th trimestre"); break; default: System.out.println("Mes no válido.");break; } } Desde luego hay un problema: el tipo String no es un tipo primitivo, por lo cual puede tomar el valor de null. Si se intenta aplicar una sentencia switch sobre una variable cuyo valor es null, el resultado será que la sentencia lanzará una excepción NullPointerException en tiempo de ejecución. NOTAR que en la nueva sentencia switch para comparar se utiliza el método equals() y no el método equalsIgnoreCase(). Ventajas: • El código será ligeramente más claro. • He leído que genera un código binario más eficiente y por tanto más rápido, pero no he encontrado referencias a pruebas de estrés que sostengan esta afirmación. Inconvenientes: • No se soporta un “case null”, que en mi opinión además debería ser obligatorio declararlo cuando la variable no sea de un tipo primitivo. • No he encontrado pruebas de rendimiento para comprobar si es más eficiente que bloques if - else anidados, o si es más eficiente refactorizar para utilizar un enumeration. Esta funcionalidad se solicitó hace 16 años, siendo probablemente por rendimiento (para objetos nullables) por lo que no se implementó antes. • Se perderá potencia si previamente debemos comprobar mediante una sentencia if si la variable es nula. • Si no se comprueba y se encapsula en un bloque try - catch se consume más recursos que un if. • Si se utiliza la sentencia assert estaremos empleando dos prácticas desaconsejadas en mi opinión: rompemos el flujo esperado del programa y utilizamos una excepción para controlar el flujo. • Ya que se ha abierto la veda para utilizar la sentencia switch con variables que no son de tipo primitivo, por qué no utilizar esta sentencia para cualquier tipo no primitivo? Con sobreescribir el método equals de nuestros objetos Y gestionar el case null en nuestra sentencia podríamos clarificar bastante más nuestro código. M i conclusión: Pobre, pero al menos mejora la legibilidad aparentemente sin contrapartidas. No se han atrevido a dar un paso completo y bien gestionado. Fuente más que probable de futuros bugs en nuestros programas, e injustificadamente menos potente de lo que debería y podría ser. Probablemente el compilador simplemente traduzca esta nueva sentencia a bloques if else anidados.