Tem como fazer isso sem precisar destes IFs?

6 respostas
alexswb

Não quero tornar os métodos “save” públicos e não gostaria de ter que verificar de que tipo é obj com todos esse IFs…

public <T> void store(T obj) throws SQLException{		
		if (obj instanceof Cotacao)
			save((Cotacao) obj);
		
		if (obj instanceof Departamento)
			save((Departamento) obj);
		
		if (obj instanceof Fornecedor)
			save((Fornecedor) obj);
		
		if (obj instanceof Solicitacao)
			save((Solicitacao) obj);
		
		if (obj instanceof ItemSolic)
			save((ItemSolic) obj);
		
		if (obj instanceof Familia)
			save((Familia) obj);
		
		if (obj instanceof Mercadoria)
			save((Mercadoria) obj);
		
		if (obj instanceof Funcionario)
			save((Funcionario) obj);		
	}
	
	
	
	private void save(Cotacao cotacao) throws SQLException{

	}
	private void save(Fornecedor fornecedor) throws SQLException{

	}
...
etc
...

6 Respostas

Rafael_Steil

Pq cada objeto nao tem o seu proprio save(), que delega pros respectivos responsaveis?

Rafael

alexswb

até tem.

mas em vez de chamar o método save de lá, eu chamo o store, que depois chama o save correspondente (que é privado).

não queria ter que deixar estes métodos saves publicos.

danieldestro

Use hibernate, ou então reflection…

fmeyer

Ainda acho que a solucao que o rafael falou é mais elegante.

Junte ela com uma interface e fica perfeito pra sua solucao

package com.fmeyer;

interface baseobject {
	public void save ();
}

class Cotacao implements baseobject {
	public Cotacao() {
		System.out.println("Constructor: Cotacao");
	}
	
	public void save(){
		System.out.println("Save da classe Cotacao");
	}
}

class Departamento implements baseobject {
	public Departamento () {
		System.out.println("Constructor: Cotacao");
	}
	
	public void save() {
		System.out.println("Save da classe Departamento");		
	}
}

class MyPersist {
	public MyPersist() {
		System.out.println("Construtor: Perist");
	}
	public void store (baseobject obj) {
		obj.save();
	}
}

public class TmpClass {

	public static void main(String[] args) {
		Cotacao cot = new Cotacao();
		Departamento dep = new Departamento();
		MyPersist mper = new MyPersist();
		
		mper.store(cot);
		mper.store(dep);
		
	}
		
}
alexswb

ai eu terei que implementar os comandos para inserir no banco em cada classe.

hum, ok…

no meu caso no construtor da classe Persit eu tenho a inicialização de vários prepared statements, assim:

public Persist(String driver, String url) throws SQLException,ClassNotFoundException{
		
		this.driver = driver;
		this.url = url;
		
		connect();
		
		sqlIncCotacao = connection.prepareStatement(
				"INSERT INTO cotacao(codcotacao,preco,coditemsolic,codfornecedor) VALUES(?,?,?,?)"
				);
		
		sqlIncDepartamento = connection.prepareStatement(
				"INSERT INTO departamento(coddepartamento,descricao,tipo) VALUES(?,?,?)"
				);
...

ai em cada método save eu só executo a query.

como ficaria desse outro jeito?

eu teria quer por cada query na sua própria classe?

e quanto a conexão com o banco, e a possibildade de trocar o banco ou o método de armazenamento?

fmeyer

vc vai ter q implementar uma persistencia mais robusta.

recomendaria vc ler este livro.

Criado 30 de agosto de 2006
Ultima resposta 31 de ago. de 2006
Respostas 6
Participantes 4