Inclusive em alguns casos isso gera NullPointerExcpetion, minha pergunta é: Qual é a melhor maneira de evitar uma Exception nesse caso ? Fazer um nullCheck em cada objeto funciona, mas o codigo fica péssimo, ficaria tipo isso:
Depende do objetivo da funcionalidade. Esse código está tão confuso que não dá pra entender nada. Se essa informação vem do banco, faria uma query já trazendo o resultado final. Mas é melhor você explicar o objetivo.
Vejo isso diariamente e isso só reforça minha opinião de que os alemães são muito bons no ramo automobilístico mas péssimos quando o assunto é software.
Códigos desse tipo só deveriam ser escritos quando se tem a certeza de que em nenhum momento das chamadas encadeadas ocorrerá NullPointerException.
E essa certeza só existe quando se implementa muito bem uma uma interface fluente ou o padrão Builder, o que não é o caso nesse tipo de código legado…
Evite escrever código assim:
if (this.getZaakdocument() != null){
if (this.getZaakdocument().getIsGerelateerdAan() != null){
if (this.getZaakdocument().getIsGerelateerdAan().getDocument() != null){
if (this.getZaakdocument().getIsGerelateerdAan().getDocument().getIsEnkelvoudigDocument() != null){
if (this.getZaakdocument().getIsGerelateerdAan().getDocument().getIsEnkelvoudigDocument().getEnkelvoudigDocument() != null){
if (this.getZaakdocument().getIsGerelateerdAan().getDocument().getIsEnkelvoudigDocument().getEnkelvoudigDocument().getFormaat().contains("pdf") ){
//do stuff
}
}
}
}
}
}
Percebeu quanto código repetido?
chamou 6 vezes o getZaakdocument(),
5 vezes o getIsGerelateerdAan(),
4 vezes o getDocument(),
3 vezes o getIsEnkelvoudigDocument() e
2 vezes o getEnkelvoudigDocument().
Ao invés disso utilize variáveis locais, é mais elegante e a execução é mais rápida.
Eu também gosto de separar esse tipo de lógica gigante em métodos, como por exemplo:
Exatamente, é uma ótima alternativa.
Tem que ver se o sistema legado em que nosso colega trabalha permite o uso do Java 8.
Eu por exemplo trabalho com um software alemão que só pode ser implementado com Java 6.
Grande sugestao.
Aliás, usando o map ao invés de flatMap você nem precisa converter o valor para optional novamente, simplificando ainda mais o código!
Percebeu quanto código repetido?
Ao invés disso utilize variáveis locais, é mais elegante e a execução é mais rápida.
Sim! Foi isso que quis dizer com “Mesmo se atribuir os gets para algum objeto, ainda ficaria bem feio.”
Vejo isso diariamente e isso só reforça minha opinião de que os alemães são muito bons no ramo automobilístico mas péssimos quando o assunto é software.
Na verdade esses são Holandeses… mas é tudo meio que a mesma coisa!
Acabei escrevendo um método parecido com esse seu “isFormat”, tá limpo, mas fica bem grande comparado com a gambiarra que só tinha uma linha… pelo menos agora não dá NP!