A declaração if-then-else
Vamos expandir nosso exemplo um pouco. E se quisermos exibir uma mensagem diferente se ela for 11h ou mais tarde? Podemos fazer isso usando apenas as ferramentas que temos? Claro que podemos!
if(hourOfDay < 11) {
System.out.println("Good Morning");
}
if(hourOfDay >= 11) {
System.out.println("Good Afternoon");
}
Isso parece um pouco redundante, já que estamos fazendo uma avaliação no hourOfDay duas vezes. Também é um desperdício porque, em algumas circunstâncias, o custo da expressão booleana que estamos avaliando pode ser computacionalmente caro. Felizmente, o Java nos oferece uma abordagem mais útil na forma de uma instrução if-then-else, como mostra a Figura 2.3.
Vamos voltar a este exemplo:
if(hourOfDay < 11) {
System.out.println("Good Morning");
} else {
System.out.println("Good Afternoon");
}
Agora nosso código está realmente ramificando entre uma das duas opções possíveis, com a avaliação booleana acontecendo apenas uma vez. O operador else usa uma instrução ou bloco de instrução, da mesma maneira que a declaração if. Dessa maneira, podemos acrescentar instruções if-then adicionais a um bloco else para chegar a um exemplo mais refinado:
if(hourOfDay < 11) {
System.out.println("Good Morning");
} else if(hourOfDay < 15) {
System.out.println("Good Afternoon");
} else {
System.out.println("Good Evening");
}
Neste exemplo, o processo Java continuará a execução até encontrar uma instrução if-then que seja avaliada como verdadeira. Se nenhuma das duas primeiras expressões for verdadeira, executará o código final do bloco else. Uma coisa a ter em mente ao criar declarações if-then-else complexas é que a ordem é importante. Por exemplo, veja o que acontece se nós reorganizarmos o trecho de código anterior da seguinte forma:
if(hourOfDay < 15) {
System.out.println("Good Afternoon");
} else if(hourOfDay < 11) {
System.out.println("Good Morning"); // UNREACHABLE CODE
} else {
System.out.println("Good Evening");
}
Para horas do dia menos de 11, esse código se comporta de maneira muito diferente do que o conjunto anterior de código. Veja se você pode determinar porque o segundo bloco nunca pode ser executado, independentemente do valor de hourOfDay.
Se um valor for menor que 11, então também deve ser menor que 15 por definição. Portanto, se a segunda ramificação no exemplo puder ser alcançada, a primeira ramificação também poderá ser alcançada. Como a execução de cada ramificação é mutuamente exclusiva neste exemplo - ou seja, apenas uma ramificação pode ser executada - se a primeira ramificação for executada, a segunda não poderá ser executada. Portanto, não há como o segundo ramo será executado, e o código é considerado inalcançável.
Verificando se a instrução funciona para uma expressão booleana
Outro lugar comum em que o exame pode tentar enganá-lo é fornecendo código onde a expressão booleana dentro da instrução if-then não é, na verdade, uma expressão booleana. Por exemplo, dê uma olhada nas seguintes linhas de código:
int x = 1;
if(x) { // DOES NOT COMPILE
...
}
Esta declaração pode ser válida em algumas outras linguagens de programação e script, mas não em Java, onde 0 e 1 não são considerados valores booleanos. Além disso, tenha cuidado com a atribuição de operadores sendo usados como se fossem operadores iguais == em declarações if-then:
int x = 1;
if(x = 5) { // DOES NOT COMPILE
...
}