Entre para a LISTA VIP da Black Friday

00

DIAS

00

HORAS

00

MIN

00

SEG

Clique para saber mais

Quando utilizar short circuit em Java

Quando utilizar short circuit em Java

Estou me preparando para a certificação da Oracle e me deparei com a situação de comparação de booleanos. Todas as vezes que precisamos fazer comparações com tipos boolean utilizamos operadores E ou OU:


System.out.println(1 > 2 & 1 == 1); // false.
System.out.println(1 == 1 | 2 > 1); // true.

Nesses exemplos a comparação é feita nos dois lados. Dois lados? Mas como assim? Isso mesmo, dois lados! Por exemplo:

Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

System.out.println(1 > 2 & 1 == 1);

Quando ele verifica a expressão 1 > 2 é identificado como uma expressão false, mas, mesmo sabendo que o resultado total será false, ele verifica o 1 == 1. Isso significa que sempre que utilizamos esses tipos de operadores a verificação será realizada tanto da condição anterior quanto da posterior! Chamamos esses operadores de _bitwise_ ou então bit a bit.

Agora vamos imaginar uma seguinte situação:


public boolean pagamento(){ 

    pagaTodasAsDividas(); 
    System.out.println("pagamento efetuado"); 
    return true;
}

public boolean temDivida(int tipo) { 
    // verifica se tem dívida 
    if (tipo == 1) { System.out.println("tem dívida"); 
        return true; } 
        else { System.out.println("não tem dívida"); 
        return false;
        }
}

if(temDivida(0) & pagamento()){ 
    System.out.println("Comprovante enviado");
}

Testando esse trecho de código:

Resultado:


\> não tem dívida > pagamento efetuado

Como assim pagamento efetuado? Sendo que não tenho dívida... Nesse caso foi feita uma comparação entre dois métodos que retornam boolean, porém o método pagamento() possui um efeito colateral e só poderia ser executado se o método temDivida() retornasse true... Para resolver esse problema podemos utilizar os operadores short circuit: && e ||. Mas qual seria a diferença? Vamos testar novamente, porém com o short circuit:


if(temDivida(0) && pagamento()){ 
    System.out.println("Comprovante enviado");
}

Verificando o resultado:


\> não tem dívida

Ótimo! Agora se não tiver dívida o pagamento não é realizado! Se testarmos em um momento em que tem dívida, ou seja, quando enviamos 1:


if(temDivida(1) && pagamento()){ 
    System.out.println("Comprovante enviado");
}

Resultado:


\> tem dívida > pagamento efetuado > enviou comprovante

Agora o trecho de código funciona perfeitamente!

Todas as vezes que fazemos uma comparação precisamos tomar certos cuidados ao escolher operadores bitwise (&, | e ^) ou um short circuit (&& e ||). Ao utilizar operadores bitwise corremos um grande risco testando um método que tenha um efeito colateral, como foi o caso do método pagamento(). A boa prática sugere o uso do short circuit justamente para evitar esse problema.

E aí, gostou do short circuit? Quer aprender mais detalhes da linguagem Java? Pensando nisso, o instrutor Guilherme Silveira criou a formação Java na Alura !

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Programação