Duvida java

3 respostas
P

Estou a criar ( universidade ) um conjunto de classes e cheguei a um ponto em que tenho uma dúvida... bem não é uma dúvida, apenas ao mandar executar a classe o resultado vai ser o mesmo:

Contexto: Uma classe Carro construtora que tem várias variáveis, ano de construção, cor, matricula, cilindrada etc... O objectivo foi criar uma rotina noutra classe que permite obter os Carros no Stand nos anos anteriores ao argumento dado ( int ano); A duvida é saber a diferença entre as duas rotinas seguintes:

1 - Esta rotina primeiro calcula os carros no vector ( ou no stand) que têm anos anteriores ao dado
2 - Depois cria um vector com a dimensão dos carros calculados no ponto 1.
3 - Percorre o vector ( ou stand) novamente, e coloca os carros no novo vector, devolvendo-o

public Carro[] getCarrosAnterioresAno(int ano){
		
		int numerocarros = 0;
		for (int i = 0; i < numcarros; i++){
			if (this.listacarros[i].getAno() <= ano)
				numerocarros++;
		}
		
		Carro[] lista = new Carro[numerocarros];

		for (int i = 0, p = 0; i < numcarros; i++){
			if (this.listacarros[i].getAno() <= ano){
				lista[p] = listacarros[i];
				p++;
			}
		}

		return lista;
	}

Ou, a próxima rotina. Muito mais simples, ocupa menos espaço, nao cria um novo Vector... só que... parece demasiado simples....

Este apenas acede ao vector ( ou stand ) directamente e procura os carros com Anos anteriores ao argumento dado ( int ano ), à medida que os encontra faz o print no ecrã! O resultado vai dar o mesmo se executar a classe de teste:::.

public void getCarrosAnterioresAnos(int ano){
		for(int i = 0; i < numcarros; i++)
			if (listacarros[i].getAno() <= ano)
				System.out.println(listacarros[i]);
		
}

Não sei se fui explícito ou não... mas alguém sabe a diferença entre usar uma ou outra classe? Os resultados no ecrã são os mesmo.

3 Respostas

alanrodrigues

não sei se entendi… você quer saber a diferença entre os métodos?
se for isto, no primeiro você obtem um vetor, para poder usar futuramente, o segundo apenas imprime…

ViniGodoy

Em termos de projeto, a primeira rotina é melhor que a segunda.
Ela separa com mais clareza a visualização dos dados, de sua obtenção.

Considere, por exemplo, que você queria exibir a lista de dados de 2 ou 3 formas. Na tela, no console ou em um relatório. Com a primeira rotina, bastaria chama-la e enviar os dados para rotinas de impressão diferentes. A segunda, te obriga a imprimir no console, ou a repetir várias vezes o for com o filtro. Nenhuma das duas coisas é desejável.

O Java possui uma classe chamada List, que representa uma lista variável de dados. A vantagem da list é que ela cresce sozinha, a medida que os dados forem sendo colocados dentro dela. Isso pode simplificar seu primeiro método para:

public List<Carro> getCarrosAnterioresAno(int ano){ List<Carro> carros = new ArrayList<Carro>(); for (int i = 0; i < numcarros; i++) { carros.add(listaCarros[i]); } return carros; }

Isso mantém a coesão do primeiro método, sem perder a simplicidade do segundo. :wink:

P

ViniGodoy:
Em termos de projeto, a primeira rotina é melhor que a segunda.
Ela separa com mais clareza a visualização dos dados, de sua obtenção.

Considere, por exemplo, que você queria exibir a lista de dados de 2 ou 3 formas. Na tela, no console ou em um relatório. Com a primeira rotina, bastaria chama-la e enviar os dados para rotinas de impressão diferentes. A segunda, te obriga a imprimir no console, ou a repetir várias vezes o for com o filtro. Nenhuma das duas coisas é desejável.

O Java possui uma classe chamada List, que representa uma lista variável de dados. A vantagem da list é que ela cresce sozinha, a medida que os dados forem sendo colocados dentro dela. Isso pode simplificar seu primeiro método para:

public List<Carro> getCarrosAnterioresAno(int ano){ List<Carro> carros = new ArrayList<Carro>(); for (int i = 0; i < numcarros; i++) { carros.add(listaCarros[i]); } return carros; }

Isso mantém a coesão do primeiro método, sem perder a simplicidade do segundo. ;)

Estou grato pela tua ajuda :).

Eu ainda estou no primeiro ano do meu curso, e só tenho 2 meses de Introdução à Programação! Obrigado pela dica da Lista, vou guardar na minha memória o seu conselho embora não o possa usar ainda :).

Cumprs

Criado 12 de dezembro de 2010
Ultima resposta 14 de dez. de 2010
Respostas 3
Participantes 3