Operadores "?" e ":"

Senhores,

Li o tópico acima, mas tenho uma cruel dúvida sobre o que está acontecendo nesta linha:

if (senhaBanco == null ? senha == null : senhaBanco.equals(senha)) {
    return true;
}

Alguém pode me esclarecer como eu devo ler esta linha?
O que é que está acontecendo nela?

Isso se chama operador ternário, funciona como um if … else.
Você usa ele assim

Condição? se verdadeiro : se falso;

Você usa uma condição antes do ‘?’ e caso seja verdadeiro você coloca o resultado q quer retornar antes do ‘:’ , se for falso você coloca o resultado q quer retornar depois do ‘:’ .

Não sei se ficou claro, mas qualquer coisa pergunta ae.

Olá,
esse tipo de teste é chamado de ternário, ou operador ternário. Ele substitui o if/else onde teriamos uma expressão if/then/else. Porém, ele só funciona se a operação tiver um retorno.

int nota = 8;
String result = nota >= 7 ? "aprovado" : "reprovado";

No exemplo acima o código nota > 7 seria o if, então, se nota > 7. O ? é o then (então) então retorne "aprovado". E o : é o else, senão retorno "reprovado".

Senhores, agradeço as explicações, mas eu já havia entendido. O que eu não consigo entender é o que está acontecendo neste código que eu postei, que por sinal foi gerado pelo próprio NetBeans após eu fazer o seguinte:

if (senhaBanco == senha) { return true; }

Segundo a lógica… o que o NetBeans fez foi o seguinte:

se (senhaBanco é igual null, sim, então senha é igual null, senão senhaBanco é igual senha) {
(…)
}

O que?
O NetBeans está tirando conclusões sozinho?
Criou AI do nada?

Cara mais fácil vc falar a comparação que quer fazer

Eu só quero entender porque o NetBeans substituiu meu if por este que postei, se não é a comparação que quero fazer.

Assumindo que senhaBanco e senha são Strings, então não devem ser comparadas com ==, que ter irá retornar sempre falso a não ser que seja o mesmo objecto (e não a mesma String).

O que o IDE terá feito foi perceber que estavas a comparar String com == e substituir pela regra certa para isso:
se senhaBanco e senha são ambos null então devolve true (são iguais). Se não, compara as strings com o método equals, que é o que deves usar SEMPRE que queres comparar objetos do tipo String.

2 curtidas

Aaaaaaaaahhh!
Agora tudo faz sentido. Realmente era só questão de interpretação.
Vlw mesmo!

Eu fiz o exercício da apostila FJ-11, da caelum, com os modos if/else e operador ternário, para comparação.

public class Funcionario {
//	variáveis private: de uso restrito dentro da classe
	private int senha;

//	método autentica com if/else
	public boolean autentica(int senha) {
		if (this.senha == senha) {
			System.out.println("Acessos Permitido!");
			return true;
		} else {
			System.out.println("Acesso Negado!");
			return false;
		}
	}

//	método autentica com operador ternário
	public void autentica2(int senha) {
		System.out.println((this.senha == senha) ? "Acesso Permitido" : "Acesso Negado");
	}


	
	

}