Devo declarar variável na classe sendo que não é um atributo dela?

Boa tarde. Pesquisei bastante mas não encontrei resposta, talvez não esteja utilizando os termos corretos.

Gostaria de saber como devo proceder nesse caso:

Tenho uma classe Carro:

    public class Carro {
        private String idCarro;
        private String marca;
        private String cor;
        private String ano;
        getters, seters, etc....
    }

Tenho um método na classe daoCarro que busca o ano do carro mais antigo, o ano do carro mais novo, o ID do carro mais novo e a diferença em anos entre os dois, isso já vem do BD.

Ex:

    public Carro buscarIdCarroMaisAntigo(){
            Carro carro = null;
            Connection con = Conexao.getConexao();
            PreparedStatement pst = con.prepareStatement(SQL);
            ResultSet rs = pst.executeQuery();

             if(rs.next()) {
                carro = new Carro();
                carro.setIdCarro(rs.getString("idCarro"));
                carro.set ??????? ---Dúvida sobre em qual variavel setar: ano carro mais antigo, ano carro mais novo, diferença de anos entre os dois

            }
            con.close();
            return carro;
    }

Nesse caso eu preciso retornar um objeto carro para classe Carro contendo todos esses dados, preciso setar os valores dentro das variáveis desse objeto, a minha dúvida é: anoCarroMaisAntigo, anoCarroMaisNovo, diferencaAnos não são atributos de um Carro, mesmo assim eu deveria criar variáveis com esses nomes na classe Carro? Devo criar um objeto Json para retornar esses dados ao invés de retornar um objeto carro? Deveria criar uma nova classe que possuisse essas váriaveis?

Obrigado.

Tudo isso depende de quanto você quer usar uma abordagem orientada à objetos ou não, ou de quanta complexidade você quer ter.

Uma abordagem simples seria retornar o carro mais novo (como um objeto Carro), o carro mais antigo (também com um objeto Carro) e fazer a diferença de anos na própria aplicação, criando por exemplo um método diferencaDeAnos(Carro carro1, Carro carro2), que recebe 2 carros e retorna a diferença de anos entre eles.

Abraço.

TerraSkilll, bom dia.
Certo, nesse caso eu retornaria um ResultSet da classe DAO para minha classe modelo, na classe modelo faria um método para calcular a diferença entre os dois anos.

Porém, minha dúvida ainda continua, sempre me esbarro em casos onde preciso setar um valor dentro de um objeto, e nesse objeto não tem nenhuma váriavel que se enquadra.

Nesse mesmo exemplo dos carros, caso eu quisesse retornar uma lista de Carros para o JSP, essa lista conteria o modelo de um carro, qual o ano do carro mais antigo, qual o ano do carro mais novo, e a diferença de anos entre os dois:

 {
      "listaCarros": [
        {
          "modelo": "GOL",
          "anoMaisAntigo": "2018",
          "anoMaisNovo": "2020",
          "diferencaAnos": 2
        },
        {
          "modelo": "UNO",
          "anoMaisAntigo": "2017",
          "anoMaisNovo": "2020",
          "diferencaAnos": 3
        }
      ]
    }

Normalmente eu criaria na classe Carro um método que geraria uma lista de carros contendo todos esses dados, depois converteria para Json, mas na minha classe Carro eu não posso ter uma variável diferencaAnos, certo? Então para não ter que criar uma variável diferencaAnos em Carro para setar esse valor, como vocês fazem?

  • Criariam uma nova classe que estendesse Carro e que poderia conter esse valor?
  • Ao invés de gerar uma lista de carros, já geraria o Json para retorno?

Obrigado pela atenção.

Não acho que exista uma abordagem perfeita, então minha sugestão é trazer os dois carros e a diferença num terceiro atributo. Em json, ficaria algo como:

{
	"listaCarros": [
		"carroMaisVelho": {
			"modelo": "GOL",
			"ano": "2010"
		},
		"carroMaisNovo" :{
			"modelo": "UNO",
			"ano": "2018"
		}
	]
	"diferencaAnos": 8
}

Eu suponho que você queira reaproveitar o código que já trabalha sobre a listaCarros atualmente, por isso quer embutir os atributos, mas a diferença de anos não é atributo de nenhum carro, como você mesmo observou, então não faz sentido tentar embuti-la dentro dos atributos do carro.

Para o meu estilo de programação, se uma informação não é necessária, eu não a traria. Por exemplo, se a classe carro possui 2050 atributos mas eu só preciso de 3, então eu só preencheria esses 3. Isso não é muito comum em cenários que se trabalhar com objetos completos (como ORMs costumam fazer).

Abraço.

1 curtida

Você deve criar somente o que precisar retornar pra funcionalidade específica. Evite modelos genéricos com misturas que impactam o projeto inteiro.

Faz o select no banco com as informações necessárias pra funcionalidade específica. Em seguida joga o resultado da query direto em um DTO específico dessa funcionalidade, contendo somente os atributos que a funcionalidade da tela ou api necessita.

2 curtidas

@TerraSkilll, @javaflex
Desculpem a demora, muito obrigado pela atenção.
Pesquisei sobre DTO e foi muito esclarecedor.