Classe e Interface

16 respostas
J

Pessoal,

Como faco para criar uma classe ou interface que receba um ResultSet e quando faco o (Cast) ele me retorne:

Integer getInteger();

através do

int getInt();

class XYZ implements ResultSet{
  Integer getInteger(){
   return new Integer(this.getInt());
  }

}

e quando eu der:

 XYZ qq=(XYZ)executeQuery();

e ai faco:

qq.getInteger(); e me retorna o valor  como WRAPPER.

mas está gerando erro! tem essa possibilidade?

16 Respostas

danieldestro

Integer i = new Integer( rs.getInt(0) );

J

Caro Daniel,

quero fazer isso automatico e transparente entendeu?

valeu

danieldestro

Integer i = (Integer) rs.getObject(0);

J

acho que vou explicar melhor…

tenho isso:
ResultSet rs=executeQuery();

Integer s=new Integer(rs.getInt(1));

e quero fazer isso:

MeuResultSet d=executeQuery();

Integer x=d.getInteger(1);

entendeu?[/code]

danieldestro

Você leu minhas respostas?
Então tire suas conclusões.

aborges

Vc quer isso?

public class MeuResultSet implements ResultSet{ //Methodos a serem implementados... }

aborges

Desculpe… Nao li seu primeiro topico direito…

C vc reparar bem no post do daniel vera q o q ele quis dizer eh q sua chamada ao methodo getInt esta errada…

Nao existe:

return new Integer(this.getInt());

Dah uma olhadinha nas possiveis construcoes do methodo e repense sua implementacao:

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html#method_summary

J

isso…só que desse jeito tenho que implementar todos…pois a classe não é abstrata…como faço?

aborges

Ooops… Respondemos juntos…

De uma olhada na resposta q coloquei antes da sua!

J

Errei na hora de digitar…o problema é quando faço o cast ele dá pau!

aborges
executeQuery();

Retorna a instancia de um objeto q tb implementa a ResultSet…

Este objeto nao esta gostando de receber como cast o MeuResultSet

J

como resolvo este problema?

aborges

Qual objeto possui o executeQuery ??

J

a interface ResultSet do JDBC

Rafael_Steil

Cara, da maneira que voce esta querendo fazer nao vai funcionar… voce vai receber uma referencia para um resultset da implementacao jdbc do driver que voce estiver usando… o que vc esta tendando resultaria na necessidade de implementacao de todos os metodos da interface, o que resulta na necessidade de controlar a posicao do cursor, verificar se ha registros e varios outros detalhes. Mesmo que a maior parte dos metodos voce delegue para a referencia original, vai ser muita duplicacao de codigo.

Essa ideia de implmementacao, pelo menos nos exemplos / necessidades que voce esta mostrando, nao tem muito sentido para existir… voce tera mais problemas com ela do que sem.

Se voce quiser tanto assim evitar o uso de new Integer() ( alias… eh soh para isso que voce quser a classe? ), entao use alguma coisa como

class RSWrapper {
    private ResultSet rs;

    public RSWrapper(ResultSet rs) {
        this.rs = rs;
    }
    
    public Integer getInteger(int pos) {
        return new Integer(this.rs.getInt(pos));
    }

    public Integer getInteger(String column) {
        return new Integer(this.rs.getInt(column));
    }
}

...

RSWrapper w = new RSWrapper(teuRs);
Integer i = w.getInteger("id");

Mas mesmo assim eh algo ruim.

Rafael

E

Esse problema se resolve facilmente com o padrao Adapter.

Esse padrao converte a interface de uma classe em outra interface
esperada pelos clientes.

Existem muitas formas de fazer, uma delas é utilizando um “Objeto Adapter” como no exemplo abaixo:

class MeuResultSet{
	
	private ResultSet rs;
	
	public MeuResultSet(ResultSet rs){
		this.rs = rs;
	}
	
	public Integer getInteger(int param){
		Integer n = new Integer(rs.getInt(1));
		return n;
	}
}

Uma pesquisa sobre Padroes é sempre bom pq resolve problemas simples como esses de uma forma estandarizada.

Criado 6 de setembro de 2004
Ultima resposta 7 de set. de 2004
Respostas 16
Participantes 5