Dúvida Classe Vector [Resolvido]

Saudações pessoal!

Estou com uma dificuldade e espero que alguém possa me ajudar.

Tenho as classes 2 e 3 extendidas da classe 1. Na classe 1 estão dados comuns às classes 2 e 3.

Estou usando a Classe Vector para armazenar todos os meu dados.

Só posso ter um código de identificação para as classes 2 e 3 (que está encapsulado na classe 1), que não pode ser repetir.

Mas na hora do cadastro, não consigo fazer com que a classe 2 enxergue os dados da classe 3 para verificar se o código já existe. Mas essa comparação funciona apenas na própria classe.

Estou achando que é por causa do tipo do objeto, mas não sei como fazer para isto funcionar.

Não sei se deu pra entender tb o que falei, mas se puderem, me ajudem. Agradeço.

Creio que da maneira que você quer fazer é muito difícil, não tem como você objter os dados internos de outra classe sendo que a classe não há extende, faça com que os dados da classe 3 sejam acessados pelos métodos da própria classe, aí você poderá ter acesso as resultados e atribuições dos attributos daquela classe, mas não aos objetos em si.

Não entendi… se o código está na classe 1, por que você quer enxergar a classe 3?

Posta seu código que a gnt entender melhor!

Estou fazendo uma interface gráfica e meu código está um pouco complicado. Colocarei um pedaço e ver se vocês entendem melhor.

Tenho este código em uma classe

Hotel hotel = new Hotel();
				if ((validaCodigo(vetorObra, Integer.parseInt(tCodigo.getText()))) == true){
					hotel.setCodigo(Integer.parseInt(tCodigo.getText()));
					hotel.setNome(tNome.getText());
					hotel.setEstado(tEstado.getText());
					hotel.setCidade(tCidade.getText());
					hotel.setAndares(Integer.parseInt(tAndares.getText()));
					hotel.setConvencionais(Integer.parseInt(tConvencionais.getText()));
					hotel.setPanoramicos(Integer.parseInt(tPanoramicos.getText()));
					hotel.setConvPan(Integer.parseInt(tPanConv.getText()));
					vetorObra.add(hotel);
					JOptionPane.showMessageDialog(null,"Cadastro realizado!","Hotéis",JOptionPane.INFORMATION_MESSAGE);
					limpaDados();
				}



public boolean validaCodigo(Vector vtArea, int cod){          
        for (int aux=0; aux<vtArea.size(); aux++){
            Obra obra = (Obra) vtArea.get(aux);     

            if(cod == obra.getCodigo()){     
            	JOptionPane.showMessageDialog(null,"Código inválido!","Hotéis",JOptionPane.WARNING_MESSAGE);
            	limpaDados();
            	
            	return false;
            }
        }
        return true;
	}

E este em outra classe

Estadio estadio = new Estadio();	
				if ((validaCodigo(vetor, Integer.parseInt(tCodigo.getText()))) == true){
					estadio.setCodigo(Integer.parseInt(tCodigo.getText()));
					estadio.setCidade(tCidade.getText());
					estadio.setEstado(tEstado.getText());
					estadio.setNome(tNome.getText());
					estadio.setCadeiras(Integer.parseInt(tCadeira.getText()));
					estadio.setBanheiros(Integer.parseInt(tBanheiros.getText()));
					estadio.setAneis(Integer.parseInt(tAneis.getText()));
					vetor.add(estadio);
					JOptionPane.showMessageDialog(null,"Cadastro realizado!","Hospital",JOptionPane.INFORMATION_MESSAGE);
					limpaDados();
					
				}



public boolean validaCodigo(Vector vetorObra, int cod){          
        for (int aux=0; aux<vetorObra.size(); aux++){
            Obra obra = (Obra) vetorObra.get(aux);     

            if((cod == obra.getCodigo())){     
            	JOptionPane.showMessageDialog(null,"Dados inválidos!","Hospital",JOptionPane.WARNING_MESSAGE);
            	limpaDados();
            	
            	return false;
            }
        }
        return true;
	}

E esta é a classe obra

public class Obra {
	private int codigo;
	private String cidade, estado, nome;
	
	public int getCodigo() {
		return codigo;
	}
	
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	public String getCidade() {
		return cidade;
	}
	
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	
	public String getEstado() {
		return estado;
	}
	
	public void setEstado(String estado) {
		this.estado = estado;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
}

O que estou tentando fazer é com que o código seja válido tanto para hotéis quanto para estádios. Ou seja, o código que será cadastrado não pode se repetir no geral e não apenas em cada classe, que é como está no código.

Sabia que a classe Vector é desaconselhado desde o Java 1.2? Ou você está usando o JME?

No lugar, use o ArrayList. E é bom especificar o tipo de list também, para evitar casts. Dá uma olhada:
http://www.guj.com.br/posts/list/74068.java#389435

[quote=ViniGodoy]Sabia que a classe Vector é desaconselhado desde o Java 1.2? Ou você está usando o JME?

No lugar, use o ArrayList. E é bom especificar o tipo de list também, para evitar casts. Dá uma olhada:
http://www.guj.com.br/posts/list/74068.java#389435[/quote]

Obrigado por esta dica. Mas mesmo usando ArrayList meu problema não foi solucionado.

Eu penso que meu problema todo está em como eu vou comparar dois dados que estão em objetos diferentes, em ArrayList diferentes. Pois tenho um ArrayList de Hotel e outro de Estadio, e os dois são extendidos da classe Obra.

Nesse caso creio que você queira comparar Obra, correto? Então você precisa implementar um equals e hashcode correto na classe obra e usar os métodos de comparação que a interface java.util.List te fornece para comparações.

Bom, vou simplificar, porque acho que para você é muito mais importante o conceito do que a solução específica para o seu problema.
Você tem uma estrutura mais ou menos assim: Três classes, onde a classe 2 e 3 herdam da classe 1.

// código para Class1
public class Class1 {
	private int id; // id para todas as classes que herdam de Class1
			// assim, Class2 e Class3 "compartilham" o mesmo id

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}
	
}[/code][code]
// código para Class2
public class Class2 extends Class1 {
	private int var2;

	public void setVar2(int var2) {
		this.var2 = var2;
	}

	public int getVar2() {
		return var2;
	}
	
}[/code][code]
// código para Class3
public class Class3 extends Class1 {
	private int var3;

	public void setVar3(int var3) {
		this.var3 = var3;
	}

	public int getVar3() {
		return var3;
	}
	
}[/code]
Observe que o atributo id é herdado pelas classes 2 e 3.
Convém observar que, pela forma com que a linguagem java foi implementada, ela é naturalmente polimórfica. Em C++, isso que vou lhe mostrar agora só seria possível se os métodos usados no polimorfismo fossem declarados virtuais. Não vou entrar em detalhes nisso, mas o importante é o que uma referência do tipo Class1 pode ser usada para processar polimorficamente as Class2 e Class3.
Suponhamos que os seus objetos Class2 estejam em vector2 e as Class3 em vector3:
[code]Vector<Class2> vector2 = new Vector<Class2>();
Vector<Class3> vector3 = new Vector<Class3>();

Bom, vou colocar nos construtores das classes a inicialização de “id”. Fica assim:

[code]
// código para Class1
public class Class1 {
private int id; // id para todas as classes que herdam de Class1
// assim, Class2 e Class3 “compartilham” o mesmo id

public Class1(int id) { // construtor para a superclasse
	setId(id);
}
public void setId(int id) {
	this.id = id;
}

public int getId() {
	return id;
}

}[/code][code]
// código para Class2
public class Class2 extends Class1 {
private int var2;

public Class2(int id) { // construtor para Class2
	super(id);
}
public void setVar2(int var2) {
	this.var2 = var2;
}

public int getVar2() {
	return var2;
}

}[/code][code]
// código para Class3
public class Class3 extends Class1 {
private int var3;

public Class3(int id) { // construtor para Class3
	super(id);
}
public void setVar3(int var3) {
	this.var3 = var3;
}

public int getVar3() {
	return var3;
}

}[/code]
Bem, uma solução burra (burra mesmo, mas dá pra aprender alguma coisa) é varrer as duas vectors e perguntar se alguém tem um id igual ao que você pretender dar à nova classe.

// função que retorna o próximo id a ser usado public int obterId() throws RuntimeException { // obter o id único for (int id=0; id<Integer.MAX_VALUE; id++) { // tentar vários ids boolean repetido = false; for (int i=0; i<vector2.size(); i++) { // varrer vector2 if (vector2.get(i).getId()==id) { repetido = true; break; } } if (!repetido) { for (int i=0; i<vector3.size(); i++) { // varrer vector3 if (vector3.get(i).getId()==id) { repetido = true; break; } } } if (!repetido) { // se ninguém tem o mesmo id return id; } } // se não achou nenhum id entre os inteiros disponíveis, já se esgotaram os ids throw new RuntimeException("acabaram os ids"); }
Daí, para criar um objeto (suponha da classe 2), você pode fazer:

int id = obterId(); vector2.add( new Class2(id));
Bom, depois eu mando (se eu me lembrar…) uma solução mais inteligente, onde os dois tipos de objetos ficam armazenados em um único vector (de Class1, que pode processar polimorficamente Class2 e Class3).

Olá rarylson!!

Agradeço a resposta!

Olha só, eu concordo com sua resposta e tb concordo que deve haver um meio mais “eficaz” de fazer isso.

Contudo, acho que tem algo que existe nessa solução apresentada que não pode ser feito no meu código. Exemplo: você usou apenas Vector de inteiros.

No meu código vou comparar vetores de tipos diferentes… e ainda, eu vou criar uma 4ª classe só para apresentar resultados…

Ou então não consegui captar vossa mensagem…

Poderei postar o código completo se for mais fácil para analizarem.

Muito obrigado a todos que respondem. Apesar de não ter conseguido fazer funcionar, estao me ajudando bastante!

Não cara, as duas classes vector elas são dos tipos: Class2 e Class3:

[quote]Vector<Class2> vector2 = new Vector<Class2>(); Vector<Class3> vector3 = new Vector<Class3>();[/quote]Agora a outra forma que eu ia falar era usando polimorfismo. Daí você poderia criar uma Vector de Class1 e processar polimorficamente tanto os objetos das Class2 e da Class3.

Pessoal,

quebrei a cabeça durante alguns dias e consegui fazer esse validação funcionar usando polimorfismo.

Meu projeto está funcionando bem. Logo que apresentar vou colocar aqui pra todos consultarem.

Obrigado a todos.