Problema com casting de objetos java

4 respostas
java
B
estou com um problema relacionado ao casting de objetos java. Tenho uma classe Sala com seus atributos e metodos. possuo varias subclasses que herdam de Sala  que são Salas. Nessas subclasses eu apenas mudo o valor de algumas variaveis ja que que todas sao  salasi, dai eu crio um objeto Sala

Sala salaCriada = null;

// novaSalaComVariaveismodificadas é um subtipo de Sala.

salaCriada = novaSalaComVariaveismodificadas;

return salaCriada;

este objeto que retorno é uma sala de certeza. O problema é que ele vem com os valores dos atributos iguais aos definidos na classe Sala e nao com os valores modificados. Para fazer as mudanças eu uso os setters das variaveis de sala Ex novaSalaComVariaveismodificadas.setFinalidade(fnovo texto); mas ao fazer o casting para Sala graças ao polimofismo o valor de salaCriada.getFinalidade ainda é o valor antigo.  tentei diretamente:

salaCriada.setFinalidade(novoTexto);

return salaCriada;

mas da o mesmo resultado.

.Alguma sugestão?

4 Respostas

matheus.cirillo

Utilize o polimorfismo a seu favor.

Sala salaCriada = new salaComAtributosModificados();

Posta seu código aqui. Fica mais fácil de te ajudar.

pmlm

O problema deve estar nas próprias classes e não na criação do objeto.

B

aqui o codigo:
PS estou usando o factory method.

package Sala;

import java.util.ArrayList;

import Evento.Evento;

/**

*

*

*/

public class Sala extends CriacaoDeSalas {

private String id;

private String tipo;

private String finalidade;

private String apelido;

private boolean estadoAberto;

private ArrayList  eventosDaSala;

private ArrayList  tiposValidos;

public ArrayList getTiposValidos() {

return tiposValidos;

}

public void setTiposValidos(ArrayList tiposValidos) {

this.tiposValidos = tiposValidos;

}

public ArrayList getEventosDaSala() {

return eventosDaSala;

}

public void setEventosDaSala(ArrayList eventosDaSala) {

this.eventosDaSala = eventosDaSala;

}

public String getApelido() {

return apelido;

}

public void setApelido(String apelido) {

this.apelido = apelido;

}

public boolean isEstadoAberto() {

return estadoAberto;

}

public void setEstadoAberto(boolean estadoAberto) {

this.estadoAberto = estadoAberto;

}

private int capacidadeFisica;
public int getCapacidadeFisica() {
	return capacidadeFisica;
}
public void setCapacidadeFisica(int capacidadeFisica) {
	this.capacidadeFisica = capacidadeFisica;
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}
public String getTipo() {
	return tipo;
}
public void setTipo(String tipo) {
	this.tipo = tipo;
}
public String getFinalidade() {
	return finalidade;
}
public void setFinalidade(String finalidade) {
	this.finalidade = finalidade;
}

@Override
public Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) {
	Sala sala = new Sala();
	return sala;
}

}

package Sala;

import Sala.Escritorio.Escritorio;

import Sala.Laboratorio.Laboratorio;

import Sala.Laboratorio.LaboratorioDeBiologia;

import Sala.Laboratorio.LaboratorioDeComputacao;

import Sala.Laboratorio.LaboratorioDeFisica;

import Sala.Laboratorio.LaboratorioDeQuimica;

import Sala.SalaDeConferencia.Conferencia;

import Sala.SalaDeConferencia.SalaDeConferenciaNormal;

import Sala.SalaDeConferencia.SalaDeVideoConferencia;

import Sala.SalaDeConferencia.VideoConferencia;

import Sala.SalasDeAula.SalaDeAula;

import Sala.SalasDeAula.SalaDeAulaComComferencia;

import Sala.SalasDeAula.SalaDeAulaComVideoConferencia;

import Sala.SalasDeAula.SalaDeAulaInteligente;

import Sala.SalasDeAula.SalaDeAulaNormal;

/**

  • @

*/
public abstract class CriacaoDeSalas {

/** cria e retorna uma nova sala de acordo com os paramentos passados
 * @param id = identificador de sala. 
 * @param capacidade = quantidade maxima de pessoas na sala.
 * @param finalidade = finalidade da sala.
 * @param tipo = tipo da sala.
 * @param apelido = apelido da sala.
 * @param aberto = se a sala esta aberta para alocação de novos eventos.
 * @return Sala
 */
public abstract Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto);

/** Charma o metodo criar salas que é implementado pelas subclasses de salas elhe passa os parametos para a criação de salas.  
 * @param id = identificador de sala. 
 * @param capacidade = quantidade maxima de pessoas na sala.
 * @param finalidade = finalidade da sala.
 * @param tipo = tipo da sala.
 * @param apelido = apelido da sala.
 * @param aberto = se a sala esta aberta para alocação de novos eventos.
 * @return Sala
 * @throws CapacidadeInvalidaException 
 * @throws TipoInvalidoException 
 */
public static  Sala pediSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) throws CapacidadeInvalidaException, TipoInvalidoException{
	Sala salaCriada = new Sala();
	
	salaCriada = salaCriada.criarSalas(id,capacidade, finalidade,  tipo,  apelido,  aberto);
			
	return salaCriada;
}

}

package Sala.SalasDeAula;

import java.util.ArrayList;

import Sala.CriacaoDeSalas;
import Sala.Sala;

/**

*

*

<em>/

public abstract class SalaDeAula extends Sala{

private ArrayList  tiposPossiveisDestaSala;

public ArrayList getTiposPossiveisDestaSala() {

return tiposPossiveisDestaSala;

}

/</em>*

* Define a finalidade sala de aula.

*/

public SalaDeAula(){

super.setFinalidade(“Sala de Aula”);

// populando tipos que serao aceitos por essa sala.

tiposPossiveisDestaSala = new ArrayList();

tiposPossiveisDestaSala.add(“Normal”);

tiposPossiveisDestaSala.add(“Inteligente”);

tiposPossiveisDestaSala.add(“Videoconferencia”);

super.setTiposValidos(tiposPossiveisDestaSala);

}

}

package Sala.SalasDeAula;

import java.util.ArrayList;

import Evento.Evento;

import Evento.EventoAulaInteligente;

import Evento.imtefacesComunsEventosSalas.Inteligente;

import Sala.Sala;

import Sala.SalasDeAula.interfacesDeSalaDeAulaEscritorio.SalaInteligente;
/**

*

*

*/

public class SalaDeAulaInteligente extends SalaDeAula implements SalaInteligente{

public SalaDeAulaInteligente(String id, int capacidade, String tipo){

super();

super.setId(id);

super.setCapacidadeFisica(capacidade);

super.setTipo(tipo);

}
public SalaDeAulaInteligente(String id, int capacidade,String tipo, String apelido){
	super();
	super.setId(id);
	super.setCapacidadeFisica(capacidade);
	super.setApelido(apelido);
	super.setTipo(tipo);
}

public SalaDeAulaInteligente(String id, int capacidade ,String tipo, String apelido, boolean aberto){
	super();
	super.setId(id);
	super.setCapacidadeFisica(capacidade);
	super.setApelido(apelido);
	super.setEstadoAberto(aberto);
	super.setTipo(tipo);
	super.setApelido("");
}
private ArrayList <Evento> eventosDaSala;

public ArrayList<Evento> getEventosDaSala() {
	return eventosDaSala;
}

public void setEventosDaSala(ArrayList<Evento> eventosDaSala) {
	this.eventosDaSala = eventosDaSala;
}

@Override
public void addEvento(EventoAulaInteligente eventoAulaInteligente) {
	eventosDaSala.add(eventoAulaInteligente);
}

@Override
public Sala criarSalas(String id, int capacidade, String finalidade, String tipo, String apelido, boolean aberto) {
	Sala salaCriada = null;
		if (tipo.equalsIgnoreCase("Inteligente")){
			SalaDeAulaInteligente salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo);
			if (apelido != null){
				salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo, apelido);
			}
			if (aberto){
				salaDeAulaInteligente = new SalaDeAulaInteligente(id, capacidade, tipo, apelido, aberto);
				}
			salaCriada = salaDeAulaInteligente;
		}
	return salaCriada;
}

}

public void adicionarSala(String id, int capacidade, String finalidade, String tipo)
throws RoomsAllocationException, CapacidadeInvalidaException, TipoInvalidoException, IdentificacaoInvalidaException, FinalidadeInvalidaException {

// fazendo a validacao
	boolean atributosValidos = true;
	ValidatorDeSala validando;
	
		try {
			validando = new ValidatorDeSala(id,  capacidade,  finalidade,  tipo, "", false);
			atributosValidos = validando.validar(id, capacidade, finalidade, tipo, "", false);
		} catch (FinalidadeInvalidaException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		} catch (IdentificacaoInvalidaException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		}catch (TipoInvalidoException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		}catch (CapacidadeInvalidaException e){
			System.out.println(e.getMessage());
		}
		

	boolean idValido = true;
	idValido = this.idNaoExistente(id, salas);
		
		if(atributosValidos && idValido){
			Sala sala = CriacaoDeSalas.pediSalas(id,  capacidade,  finalidade,  tipo, "", false);
			this.salas.add(sala);
		}
		this.imprimirListaDeSalas();

				

}

este é todo o caminho que os parametos passam. PS existem dezenas de outros subtipos de classes salas. Não as postei pois o processo é o mesmo.este ultimo metodo é o mais importante.

pmlm

Não analisei todo o código mas não há sobrescrita de métodos static. O teu problema pode estar aqui.

Criado 7 de janeiro de 2017
Ultima resposta 8 de jan. de 2017
Respostas 4
Participantes 3