Operador ? (se nulo)

Fala galera, boa tarde!

Existe algum operador em Java parecido com o “??” do C#?

Um exemplo:

return getName() ?? "Nome indefinido";

ou seja, se o retorno do método 'getName() ’ for nulo, ele retorna a String “Nome indefinido”

ou eu devo fazer:

String nome = getName();
return nome == null ? "Nome indefinido" : nome;

Não encontrei nenhum outo post com esse assunto.

Grato

Infelizmente Java não conta com vários dos “açúcares sintáticos” do C#.

Precisa usar da segunda forma mesmo.

Ok, obrigado.

Você pode usar o google-guava para isso:

return Objects.firstNonNull(nome, "Nome indefinido")Blz? Flw! :thumbup:

[quote=von.juliano]Você pode usar o google-guava para isso:

return Objects.firstNonNull(nome, "Nome indefinido")

Oi,

Aposto uma coxinha contra um guaraná que o código interno deste método é:

return (nome == null ? "Nome indefinido" : nome);

Tchauzin!

Tu pode fazer assim:

nome == null || nome.trim().isEmpty() ? "Nome indefinido" : nome;

Com isso o nome não pode ser NULO, vazio ou com espaços vazios.
Já usei uma validação assim.

@lina

Quase isso, a diferença é só que ele também verifica se o segundo é nulo, e se for, lança uma NullPointerException. A vantagem está em já ter um monte de coisas simples empacotadas, assim não precisamos escrever classes como a famosa StringUtils.

Mas agora você me deve uma coxinha! :mrgreen:

Flw! :thumbup:

[quote=von.juliano]@lina

Quase isso, a diferença é só que ele também verifica se o segundo é nulo, e se for, lança uma NullPointerException. A vantagem está em já ter um monte de coisas simples empacotadas, assim não precisamos escrever classes como a famosa StringUtils.

Mas agora você me deve uma coxinha! :mrgreen:

Flw! :thumbup: [/quote]

Oi,

A desvantagem é ter que usar mais um “pacote” de bibliotecas acopladas ao seu JAR ou ao seu Java.

Pode pagando meu guaraná :twisted:

Tchauzin!

@von.juliano,

eu também acho deve um guaraná para a Lina.
Pois isso aqui, que ela demonstrou:

return (nome == null ? "Nome indefinido" : nome);

Jamais vai dar um NullPointerException :slight_smile:

[quote=lina]Oi,

A desvantagem é ter que usar mais um “pacote” de bibliotecas acopladas ao seu JAR ou ao seu Java.

Pode pagando meu guaraná :twisted:

Tchauzin![/quote]
Não vejo como desvantagem, prefiro isso ao invés de adicionar StringUtils em todos os projetos. Sem contar um monte de outras classes utilitárias!

E o código do método é esse:

[code]public static T firstNonNull(@Nullable T first, @Nullable T second) {
return first != null ? first : checkNotNull(second);
}

// esse método é da classe Preconditions
public static T checkNotNull(T reference) {
if (reference == null) {
throw new NullPointerException();
}
return reference;
}[/code]Então dá sim NullPointer! A lina me deve a coxinha! :mrgreen:

Dá NullPointer usando esta API, eu me referia ao if ternario.
Só não acho interessante adicionar uma API para usar um único método, não para esse caso.

Mas ai é questão de parar e analisar. Apenas que o if ternario resolve isso de maneira simples, é sem dúvida.

[quote=nel]Dá NullPointer usando esta API, eu me referia ao if ternario.
Só não acho interessante adicionar uma API para usar um único método, não para esse caso.

Mas ai é questão de parar e analisar. Apenas que o if ternario resolve isso de maneira simples, é sem dúvida.[/quote]
@nel

O caso é que null não deve ser utilizado. Nunca passe nem devolva null, isso é adicionar trabalho desnecessário a sua aplicação. Mas de qualquer forma, principalmente quando você trabalha com apis mais antigas, você tem que lidar com o null, e aí é que fica interessante você ter uma api só para fazer essas coisas simples, sem que você tenha que copiar suas classes *Utils para todos os projetos. Essa é a idéia do guava, um compilado de classes *Utils que sempre criamos em qualquer projeto. Depois de adotar o guava, nunca mais fiz verificações variavel == null.

Flw! :thumbup:

[quote=nel]Dá NullPointer usando esta API, eu me referia ao if ternario.
Só não acho interessante adicionar uma API para usar um único método, não para esse caso.

Mas ai é questão de parar e analisar. Apenas que o if ternario resolve isso de maneira simples, é sem dúvida.[/quote]

++

[quote=von.juliano][quote=nel]Dá NullPointer usando esta API, eu me referia ao if ternario.
Só não acho interessante adicionar uma API para usar um único método, não para esse caso.

Mas ai é questão de parar e analisar. Apenas que o if ternario resolve isso de maneira simples, é sem dúvida.[/quote]
@nel

O caso é que null não deve ser utilizado. Nunca passe nem devolva null, isso é adicionar trabalho desnecessário a sua aplicação. Mas de qualquer forma, principalmente quando você trabalha com apis mais antigas, você tem que lidar com o null, e aí é que fica interessante você ter uma api só para fazer essas coisas simples, sem que você tenha que copiar suas classes *Utils para todos os projetos. Essa é a idéia do guava, um compilado de classes *Utils que sempre criamos em qualquer projeto. Depois de adotar o guava, nunca mais fiz verificações variavel == null.

Flw! :thumbup: [/quote]

Oi,

Não existe problemas em fazer variavel == null e sim variavel != null

Tchauzin!

Esse tipo de syntax suggar foi proposto para o Java 7, mas negado depois de algumas considerações:
http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html

A proposta era implementar na forma do Elvis Operator do Groovy

return nome ?: "Indefinido";

Tem muita panaquice “anti-syntax suggar” no comitê no Java.
Até hoje não sei como uma sintaxe tão rebuscada quanto a dos generics foi aprovada.

O fato é que a linguagem poderia ser bem mais confortável de se programar. Mas não é.
Não existe sobrecarga de operadores, atributos e detalhes como esse para facilitar a vida, simplificar o código e deixá-lo mais legível.

Felizmente a pressão de outras linguagens (como o C#), está fazendo o pessoal do comitê e da Oracle flexibilizar um pouco mais.