Java7, Nuevo soporte del tipo String en sentencias

Anuncio
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.
Descargar