Problema com a referência do objeto no Array

4 respostas
mkaule

Olá pessoal, estou eu aqui ‘noobando’. Tem um tempinho que eu não mexo com arrays.
Vim brincar aqui, e estou apanhando com o seguinte detalhe. Quando vou imprimir um resultado
de um objeto, no caso o meu em questão ele só está imprimindo o ultimo objeto que eu adiciono no meu array.

OBS: Eu sei que posso usar Collections/Várias outras estruturas de dados do java. Mas quero usar essa em questão
e de uma forma um pouco mais elegante, se é que isso é possível.

Dês de já agradeço :slight_smile:

public class Equipe {
	private String nome;
	private Piloto pilotos[];

	public Equipe(){
		setPilotos(new Piloto[2]);
	}

	public void addPiloto(Piloto piloto){
		for (int i = 0; i < pilotos.length; i++) {
			pilotos[i] = piloto;
		}
	}
/* getters and setters*/
public class Piloto {
	private String nome;
	private int idade;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getIdade() {
		return idade;
	}
	public void setIdade(int idade) {
		this.idade = idade;
	}
}
public class Populate {
	MyScanner sc = new MyScanner();
	
	public Piloto getPiloto(){
		
		Piloto piloto = new Piloto();
		
		piloto.setNome(sc.getString("Nome: "));
		piloto.setIdade(sc.getInt("Idade: "));
		
		return piloto;
	}
public class Main {
	
	
	public static void main(String[] args) {
		
		Populate populate = new Populate();
		Equipe equipe = new Equipe();
		
		equipe.addPiloto(populate.getPiloto());
		
	}
}

4 Respostas

nel

Oi,

não analisei muito o seu código porque não gostei dele. Acredito que tu possa melhora-lo de forma a usar melhor os conceitos de OO e o que o Java oferece.
Fora essa crítica que eu espero que seja produtiva, segue uma observação:

public class Equipe {  
    private String nome;  
    private Piloto pilotos[];  
  
    public Equipe(){  
        setPilotos(new Piloto[2]);  
    }  
  
    public void addPiloto(Piloto piloto){  
        for (int i = 0; i < pilotos.length; i++) {  
            pilotos[i] = piloto;  
        }  
    }  
   // getters e setters
}

Perceba que a cada vez que instanciar uma Equipe terás dois novos Pilotos. É isso mesmo ?
Bom, creio que sim né? :)

Outro detalhe e o mais importante, cada vez que tu adiciona um Piloto tu sobrescreve o anterior, pois tu faz um laço de repetição do tamanho do seu vetor e atribui o novo Piloto a todo o Array. Aqui tem uma solução sem ser muito elegante mas que resolve seu problema.

public class Equipe {  
    private String nome;  
    private Piloto pilotos[];  
    private int qtdade;
    private int index;
  
    public Equipe(){  
        setPilotos(new Piloto[2]);  
        this.qtdade = this.pilotos[].lenght;
        this.index = 0;
    }  
  
    public void addPiloto(Piloto piloto){  
       if(index < qtdade) {
         this.pilotos[index] = piloto;
         index++;
       }
    }

Pode ter certeza que tem coisa muito melhor para ser feita :)

mkaule

Crítica bastante produtiva nel.

Sim cada vez q instancio uma equipe tem 2 pilotos uma vez q nesse exemplo eu só faço isso uma vez, logo só tenho 2 pilotos. A idéia é essa mesmo. Cara é isso mesmo eu estou sobrescrevendo o anterior. Mas eu não queria sair instanciando piloto[0] = new Piloto, piloto[1] = new Piloto();

=/

nel
mkaule:
Crítica bastante produtiva nel.

Sim cada vez q instancio uma equipe tem 2 pilotos uma vez q nesse exemplo eu só faço isso uma vez, logo só tenho 2 pilotos. A idéia é essa mesmo. Cara é isso mesmo eu estou sobrescrevendo o anterior. Mas eu não queria sair instanciando piloto[0] = new Piloto, piloto[1] = new Piloto();

=/

Como não ?
Cada Piloto deve ser um individuo único, não concorda ?
Poderia ser inclusive um objeto imutavél, mas não vou entrar nestes méritos.
Acrescentando o que eu te passei como modificação, tu só faria isso:

public class Main {  
      
      
    public static void main(String[] args) {  
          
        Populate populate = new Populate();  
        Equipe equipe = new Equipe();  
          
        equipe.addPiloto(populate.getPiloto());
        equipe.addPiloto(populate.getPiloto()); 
          
    }  
}

Não é somente isso? O que tu quis me dizer é modificar o getPiloto?

mkaule

rsrs…

Desculpa nel, acho que você não entendeu o que eu quis dizer. Sim sua crítica foi muito bem vinda eu entendi perfeitamente. E se não for pedir demais. Você disse que estou usando de forma errada OO. Onde mesmo ?

Valeu !! (:

Criado 11 de outubro de 2011
Ultima resposta 11 de out. de 2011
Respostas 4
Participantes 2