6.1 Uso de instrucciones if y switch - ajpaez/OCA GitHub Wiki
(OCA Objectives 3.4 and 3.5 — also Upgrade Objective 1.1)
Las instrucciones if y switch se denominan comúnmente declaraciones de decisión.
Instrucción if-else
Es aconsejable escribir todos las llaves, aun si solo se tiene una instrucción en el if.
if (price < 300) {
buyProduct();
} else if (price < 400) {
getApproval();
} else {
dontBuyProduct();
}
Si tenemos un if sin llaves y seguido un if y un else, el else corresponde al segundo if, ejemplo:
if (exam.done())
if (exam.getScore() < 0.61)
System.out.println("Try again.");
// Which if does this belong to?
else
System.out.println("Java master!");
Expresiones correctas para instrucciones if
Las expresiones que se evalúan en un if deben ser expresiones boolean. Cualquier expresión que se resuelva con un boolean es correcta.
int y = 5;
int x = 2;
if (((x > 3) && (y < 2)) | doStuff()) {
System.out.println("true");
}
En java 0 != false, y 1 != true
También podemos ver algo así, una asignación como expresión:
boolean boo = false;
if (boo = true) { }
En este caso la expresión se resuelve como true, ya que el resultado de cualquier asignación es el valor de la variable después de ser asignada. Esto solo sucede con las asignaciones booleanas!!!
int x = 3;
if (x = 5) { } // Won't compile because x is not a boolean!
Instrucciones switch
int x = 3;
switch (x) {
case 1:
System.out.println("x equals 1");
break;
case 2:
System.out.println("x equals 2");
break;
default:
System.out.println("No idea what x is");
}
Expresiones correctas para instrucciones switch
Switch solo evalúa la igualdad de la expression y las constants!
Las expresiones usadas en un switch son las siguientes:
switch (expression) {
case constant1: code block
case constant2: code block
default: code block
}
Las expresiones que pueden ser usadas en un switch son char, byte, short, int, enum y String, en otras palabras, solo acepta enum, String y cualquier valor o variable que sea posible castear de forma implícita a un int. Con cualquier otro tipo de dato no compilará el código.
En caso de usar un tipo de dato con rango de valores pequeño, como puede ser un byte y utilizar un case con valor superior a su rango de valores, como puede ser 128, el código no compilará!
En caso de usar constantes deben ser evaluadas del mismo tipo que el usado en la expresión y estas deben de estar definidas en tiempo de compilación. En otras palabras, solo se pueden usar constantes o variable finales que sean inicializadas inmediatamente tras su declaración con un valor literal.
final int a = 1;
final int b;
b = 2;
int x = 0;
switch (x) {
case a: // ok
case b: // compiler error
}
- No está permitido repetir valores en los cases
- La palabra reservada case es obligatorio, y debe de respetar su estructura case X: { }
Introducción a la "equality" de String
En el caso de los objetos String dos cadenas se consideran iguales si tienen la misma secuencia case-sensitive de caracteres. Por tanto se puede usar en un switch de la siguiente forma:
String s = "Monday";
switch(s) {
case "Monday": // matches!
}
Break y Fall-Through en switch
Clave: Las constantes de los cases son evaluados de arriba abajo y el primer case que coincida es ejecutado como punto de entrada, y se ejecutarán todos los bloques de código siguientes hasta que se encuentre la expresión break;
Este comportamiento de la instrucción switch se conoce Fall-Through, debido a que la ejecución de los bloques cases cae de uno a otro.
- Oracle recomiendo añadir un comentario //fall through cuando usemos dicho comportamiento
The Default Case
El orden de los cases no importa, es decir, se pueden usar:
case 2:
break;
default:
break;
case 1:
break;
y si la expresión no coincide ni con 2 ni con 1, entrará en el case de por defecto.
Y a el case default la expresión break le afecta al igual que al resto de case, si no existe y el case default no es el ultimo ejecutara el resto de case en fall throgh, por ejemplo:
int x = 7;
switch (x) {
case 2: System.out.println("2");
default: System.out.println("default");
case 3: System.out.println("3");
case 4: System.out.println("4");
}
imprimirá:
default
3
4