3
respostas

Solução concatenando o nome do titular no método toString() da classe Conta

Em vez de concatenar o nome do titular na impressão específica da classe Teste, incorporei o nome do titular no método toString() da classe Conta, que já continha o número da conta e agência. Talvez sirva como reaproveitamento de código em futuras aplicações. Mas tive que incluir um tratamento especial para o caso de não haver ainda um titular para a conta, uma vez que os construtores não o exigem. É válido? Segue o código:

public abstract class Conta { public double saldo; private int agencia; private int numero; private Cliente titular; private static int total = 0;

//código omitido

@Override public String toString() { String nomeTitular = "Conta sem titular"; if (titular != null) {nomeTitular = this.titular.getNome();} return "número: " + this.numero + "; agência: " + this.agencia + "; Titular: " + nomeTitular; } }

3 respostas

Olá Sergio, tudo bem?

Nesse caso, sim. Já que estamos numa situação onde o toString() está servindo apenas o propósito de nos fornecer uma representação da classe que faça sentido para nós.

A motivação para eu estar dizendo isso foi por conta da sua menção ao reaproveitamento de código em futuras aplicações. Quando estamos usando o toString() é preciso ter cuidado, pois nada garante que a informação que estamos retornando através do toString() realmente representa uma informação referente à classe Conta. Não há nada no sistema de tipagem do Java que garante que o que estamos retornando está correto, desde que o toString() retorne uma String, está tudo bem para ele.

Portanto, o que eu quero dizer é que nunca devemos usar o toString() para nada relacionado ao comportamento da aplicação e nem para representar dados que sejam relevantes para o negócio. Então, a não ser que ele tenha o propósito de auxiliar na hora de "debugar" a aplicação ou ajudar a entender seu comportamento durante sua execução, tudo bem utilizá-lo.

Mas enfim, é só tomar cuidado quando usamos o toString() em situações onde o processo é automatizado e não temos total controle sobre o que uma classe está retornando!

Se tiver qualquer dúvida é só avisar!

Forte abraço e bons estudos!!

Valeu, Thiago, obrigado pela resposta, mas fiquei meio perdido: se o código do toString() foi feito por mim, dentro de uma classe Conta criada por mim, porque eu não teria certeza do conteúdo da informação? Desculpe insistir, mas é que me pareceu que este tipo de questão me pareceu bem crítico se queremos ter códigos confiáveis, de acordo com seus comentário. Obrigado!

Opa Sergio. Sem problemas! Mas vamos lá!

Caso o retorno do toString() esteja dentro do seu controle ou esteja lá para ser manipulado por outras pessoas manualmente, tudo bem utilizá-lo. O único alerta que eu deixo é caso o toString() esteja sendo utilizado em um contexto automatizado (onde ninguém saberá exatamente o que ele está retornando). Então ao invés de usar o toString(), talvez seja uma boa ideia delegar a função de retornar uma determinada String a um método que tenha essa responsabilidade específica.

Peço desculpas caso tenha ficado confuso, isso na verdade é algo que devemos ter em mente para qualquer coisa. Como toString() é um método que está disponível em todas as classes e nada nele indica exatamente o que ele está retornando, depender dele em processos que são importantes para que sua aplicação funcione da forma desejada pode acabar quebrando algo. Muito melhor seria utilizar um getter (ou qualquer outro método que faça sentido) caso seja necessário resgatar alguma informação da sua classe, já que nesse caso sabemos claramente qual é o propósito do método e o que ele deve retornar. De novo, não tem problema caso seja um processo manual onde as pessoas saberão se qualquer coisa estiver estranha no retorno do método toString().

Peço desculpas pelo texto extenso, basta seguir as boas práticas e delegar responsabilidades à métodos que sejam expressivos e façam sentido para que for ler o seu código. Seguindo isso você não terá problemas! ;)

Se algum ponto não fez sentido, por favor me avise!

Abraços!!