Condiciones múltiples en Java

A veces tenemos que encadenar muchas condiciones para conseguir nuestro objetivo. Otras veces podemos tener que elegir entre muchos valores. Vamos a verlo.

Puedes copiar este código y pegarlo en un archivo que se llame B_CondicionesMultiples.java dentro del paquete B_ControlDeFLujo para comprobar su funcionamiento.

/* Aprendiendo a programar en DAM con elProfesorEmilio */
package B_ControlDeFlujo;

/**
 *
 * @author elProfesorEmilio
 */
public class B_CondicionesMultiples {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String mes = "abril";
        // Escribir en función del mes, la estación
        // Vamos a suponer que las estaciones comienzan el 1 del mes en
        // el que comienzan realmente, es decir, el 1 de septiembre empieza otoño
        // y así con todos.
        
        // Ojo a cómo se comparan las cadenas
        if (mes.equals("enero") || mes.equals("diciembre") || mes.equals("febrero")) {
            System.out.println("Invierno");
        }
        if (mes.equals("marzo") || mes.equals("abril") || mes.equals("mayo")) {
            System.out.println("Primavera");
        }
        if (mes.equals("junio") || mes.equals("julio") || mes.equals("agosto")) {
            System.out.println("Verano");
        }
        if (mes.equals("septiembre") || mes.equals("octubre") || mes.equals("noviembre")) {
            System.out.println("Otoño");
        }
        // La estructura condicional anterior está mal, porque una vez
        // que entra en una condición verdadera, sigue comprobando
        // el resto, cuando ya sabemos que no se van a cumplir
        // Probad a depurarla poniendo una línea de ruptura en la línea 21
        // y dando de valor a mes = "enero"
        
        // Este if está mejor construido porque no ejecuta condiciones inútiles
        if (mes.equals("enero") || mes.equals("diciembre") || mes.equals("febrero")) {
            System.out.println("Invierno");
        } else {
            if (mes.equals("marzo") || mes.equals("abril") || mes.equals("mayo")) {
                System.out.println("Primavera");
            } else {
                if (mes.equals("junio") || mes.equals("julio") || mes.equals("agosto")) {
                    System.out.println("Verano");
                } else {
                    if (mes.equals("septiembre") || mes.equals("octubre") || mes.equals("noviembre")) {
                        System.out.println("Otoño");
                    }        
                }                
            }
        }
        
        // Se puede construir con menos líneas, ahorrando llaves
        // Aquí veis la estructura más visual
        if (mes.equals("enero") || mes.equals("diciembre") || mes.equals("febrero")) {
            System.out.println("Invierno");
        } else 
            if (mes.equals("marzo") || mes.equals("abril") || mes.equals("mayo")) {
                System.out.println("Primavera");
            } else 
                if (mes.equals("junio") || mes.equals("julio") || mes.equals("agosto")) {
                    System.out.println("Verano");
                } else 
                    if (mes.equals("septiembre") || mes.equals("octubre") || mes.equals("noviembre")) {
                        System.out.println("Otoño");
                    }        

        // Y ahora la estructura más compacta
        if (mes.equals("enero") || mes.equals("diciembre") || mes.equals("febrero")) {
            System.out.println("Invierno");
        } else if (mes.equals("marzo") || mes.equals("abril") || mes.equals("mayo")) {
            System.out.println("Primavera");
        } else if (mes.equals("junio") || mes.equals("julio") || mes.equals("agosto")) {
            System.out.println("Verano");
        } else if (mes.equals("septiembre") || mes.equals("octubre") || mes.equals("noviembre")) {
            System.out.println("Otoño");
        }        
        
        // Y finalmente usamos la instrucción switch 
        // Esta instrucción evalúa una expresión, que debe devolver un 
        // valor discreto
        
        switch (mes) {
            case "diciembre": 
            case "enero": 
            case "febrero":
                System.out.println("Invierno");
            break;
            case "marzo": 
            case "abril": 
            case "mayo":
                System.out.println("Primavera");
            break;
            case "junio": 
            case "julio": 
            case "agosto":
                System.out.println("Verano");
            break;
            case "septiembre": 
            case "octubre": 
            case "noviembre":
                System.out.println("Otoño");
            break;
            default:
                System.out.println("Entrada incorrecta");
        }
        
        
        // Condicional múltiple switch
        // para una variable compara valores discretos que dicha variable pueda tomar
        // deben ir separadas por break
        String dia = "lunes";
        
        switch (dia) {
            case "lunes": 
                System.out.println("laborable");
                break;
            case "martes": 
                System.out.println("laborable");
                break;
            case "miércoles": 
                System.out.println("laborable");
                break;
            case "jueves": 
                System.out.println("laborable");
                break;
            case "viernes": 
                System.out.println("laborable");
                break;
            case "sábado": 
                System.out.println("festivo");
                break;
            case "domingo": 
                System.out.println("festivo");
                break;
            // La sentencia default se ejecuta si nada de lo anterior ha coincidido
            default: 
                System.out.println("no es un día correcto");
                break;
        }
        
        // Si no usamos break se puede asignar el mismo comportamiento a varios valores
        
        switch (dia) {
            case "lunes": 
            case "martes": 
            case "miércoles": 
            case "jueves": 
            case "viernes": 
                System.out.println("laborable");
                break;
            case "sábado": 
            case "domingo": 
                System.out.println("festivo");
                break;
            default: 
                System.out.println("no es un día correcto");
                break;
        }        
        
        // No siempre se puede sustituir un if por un swicth
        // Prueba a descomentar
        /*
        if (3>5) {
            
        }
        
        switch(3>5) {
            case true:
        }
        
        boolean a = 3>5;
        switch(a) {
            case true:
        }
        */        
        
        // Existen veces en las que un switch es mejor que un if 
        // (por ejemplo arriba) pero otras en las que un switch es mejor 
        // sustituirlo por una estrucutra de tipo
        // if ... else if ... else if ... else
        
        char a = 'x';
               
        if (a>=65&&a<=90) {
            System.out.println("Mayúscula");
        } else if (a>='a' && a<='z') {
            System.out.println("Minúscula");
        } else if (a>='0' && a<='9') {
            System.out.println("Dígito");
        } else if (a==',' || a=='.'|| a==';' || a==':') {
            System.out.println("Signo de puntuación");
        } else if (a==' ') {
            System.out.println("Espacio en blanco");
        } else {
            System.out.println("Otro carácter");
        }        
    }  
}