Como transformar Classe em Interface?

11 respostas
P

Como faço para transformar essa classe em uma INTERFACE?

Hoje Invoco ela assim:

try {
			ManutencaoTabela mt = new ManutencaoTabela(parceiroComercial, "ParceirosComerciais2", cnn);
			mt.IncluiRegistro();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Quero seja assim:

ManutencaoTabela.IncluiRegistro();

Essa é a classe:

/*
 * ManutencaoTabela.java
 *
 * Created on 23 de Junho de 2007, 21:01
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.com.copaiba.manutencoes;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.GregorianCalendar;
import java.util.LinkedHashMap;
import javax.swing.JOptionPane;


/**
 *
 * @author Paulo Roberto
 */
public class ManutencaoTabela {
    private Connection conexao;
    private Object tabela;
    private String nomeTabela;
    private ResultSet rsChavesTabela;
    private ResultSet rsColunasTabela;
    private ResultSet rsAtributosTabela;
    private LinkedHashMap<String, Object> lhmAtributosClasse;
    
    public ManutencaoTabela(final Object tabela, final String nomeTabela, final Connection conexao) throws SQLException {
        this.conexao = conexao;
        this.tabela = tabela;
        this.nomeTabela = nomeTabela;
        this.rsChavesTabela = conexao.getMetaData().getPrimaryKeys(this.conexao.getCatalog(), "root", "tb_" + this.nomeTabela);
        this.rsColunasTabela = conexao.getMetaData().getColumns(this.conexao.getCatalog(), "root", "tb_" + this.nomeTabela, null);
        this.rsAtributosTabela = conexao.getMetaData().getAttributes(this.conexao.getCatalog(), "root", "tb_" + this.nomeTabela, "");
        this.lhmAtributosClasse = new LinkedHashMap<String, Object>();
    }
    
    public void IncluiRegistro() throws SQLException {
        ExecutaTransacao(PreparaInclusaoRegistro());
    }
    
    public void AtualizaRegistro() throws SQLException {
        ExecutaTransacao(PreparaAlteracaoRegistro());
    }
    
    public void ExcluiRegistro() throws SQLException {
        ExecutaTransacao(PreparaExclusaoRegistro());
    }
    
    public void RecuperaRegistro() throws SQLException {
        ExecutaTransacao(PreparaRecuperacaoRegistro());
    }
    
    protected void ExecutaTransacao(final String strSQL) {
        this.lhmAtributosClasse = getAtributosClasse();
        
        try {
            //Prepara transação
            PreparedStatement pstmt = conexao.prepareStatement(strSQL);

            //Atribui valores aos parâmetros
            int i = 0;
            
            //Inclusão
            if (strSQL.indexOf("INSERT INTO") > -1) {
                //Parâmetros de contexto da QUERY
                rsColunasTabela.beforeFirst();
                while (rsColunasTabela.next()) {
                    if (rsColunasTabela.getString("IS_AUTOINCREMENT").equals("NO")) {
                        pstmt = TrataParametro(pstmt, ++i, this.lhmAtributosClasse.get(rsColunasTabela.getString("COLUMN_NAME")));
                    }
                }
                
                //Mostra String SQL
                System.out.println(pstmt.toString());
            
                //Executa  procedimento
                pstmt.executeUpdate();
            } else if (strSQL.indexOf("UPDATE") > -1) {
                //Parâmetros de contexto da QUERY
                rsColunasTabela.beforeFirst();
                while (rsColunasTabela.next()) {
                    if (rsColunasTabela.getString("IS_AUTOINCREMENT").equals("NO")) {
                        pstmt = TrataParametro(pstmt, ++i, this.lhmAtributosClasse.get(rsColunasTabela.getString("COLUMN_NAME")));
                    }
                }
                
                //Parâmetros da cláusula WHERE
                rsChavesTabela.beforeFirst();
                while (rsChavesTabela.next()) {
                    pstmt = TrataParametro(pstmt, ++i, this.lhmAtributosClasse.get(rsChavesTabela.getString("COLUMN_NAME")));
                }
                
                //Mostra String SQL
                System.out.println(pstmt.toString());
            
                //Executa  procedimento
                pstmt.executeUpdate();
            } else if (strSQL.indexOf("DELETE FROM") > -1) {
                //Parâmetros da cláusula WHERE
                rsChavesTabela.beforeFirst();
                while (rsChavesTabela.next()) {
                    pstmt = TrataParametro(pstmt, ++i, this.lhmAtributosClasse.get(rsChavesTabela.getString("COLUMN_NAME")));
                }
                
                //Mostra String SQL
                System.out.println(pstmt.toString());
            
                //Executa  procedimento
                pstmt.executeUpdate();
            } else if (strSQL.indexOf("SELECT FROM") > -1) {
                //Parâmetros da cláusula WHERE
                rsChavesTabela.beforeFirst();
                while (rsChavesTabela.next()) {
                    pstmt = TrataParametro(pstmt, ++i, this.lhmAtributosClasse.get(rsChavesTabela.getString("COLUMN_NAME")));
                }
                
                //Mostra String SQL
                System.out.println(pstmt.toString());
            
                //Executa  procedimento
                pstmt.executeQuery();
            }
            
            ////Mostra parâmetros e seus respectivos valores - (Esta PORRA!, não Funciona com alguns Drivers. Inclusive este!)
            //System.out.println("Parâmetros ...");
            //
            //ParameterMetaData pmd = pstmt.getParameterMetaData();
            //
            //for (int i2 = 1; i2 < pmd.getParameterCount(); i2++) {
            //    System.out.println("Parameter number " + i2);
            //    System.out.println("  Class name is " + pmd.getParameterClassName(i2));
            //    // Note: Mode relates to input, output or inout
            //    System.out.println("  Mode is " + pmd.getParameterClassName(i2));
            //    System.out.println("  Type is " + pmd.getParameterType(i2));
            //    System.out.println("  Type name is " + pmd.getParameterTypeName(i2));
            //    System.out.println("  Precision is " + pmd.getPrecision(i2));
            //    System.out.println("  Scale is " + pmd.getScale(i2));
            //    System.out.println("  Nullable? is " + pmd.isNullable(i2));
            //    System.out.println("  Signed? is " + pmd.isSigned(i2));
            //}
            
            //Fecha procedimento
            pstmt.close();
        } catch (SQLException errorSQL) {
            JOptionPane.showMessageDialog(null, errorSQL.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
            errorSQL.printStackTrace();
        }
    }
    
    protected String PreparaInclusaoRegistro() throws SQLException {
        StringBuffer sbSQL;

        //Inclui Registro
        sbSQL = new StringBuffer();
                
        sbSQL.append("INSERT INTO ").append("tb_").append(this.nomeTabela).append(" ");
        sbSQL.append("(");
        
        //Lista as entradas (Campos da Tabela)
        rsColunasTabela.beforeFirst();
        while (rsColunasTabela.next()) {
            if (rsColunasTabela.getString("IS_AUTOINCREMENT").equals("NO")) {
                sbSQL.append(rsColunasTabela.getString("COLUMN_NAME")).append((", "));
            }
        }   
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
        
        sbSQL.append(") VALUES (");
        
        //Lista as entradas (Parâmetros)
        rsColunasTabela.beforeFirst();
        while (rsColunasTabela.next()) {
            if (rsColunasTabela.getString("IS_AUTOINCREMENT").equals("NO")) {
                sbSQL.append("?, ");
            }
        }   
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
        
        sbSQL.append(")");
        
        return sbSQL.toString();
    }
    
    protected String PreparaAlteracaoRegistro() throws SQLException {
        StringBuffer sbSQL;

        //Alterar Registro
        sbSQL = new StringBuffer();
        
        sbSQL.append("UPDATE ").append("tb_").append(this.nomeTabela).append(" SET ");
        
        //Lista as entradas (Parâmetros)
        rsColunasTabela.beforeFirst();
        while (rsColunasTabela.next()) {
            if (rsColunasTabela.getString("IS_AUTOINCREMENT").equals("NO")) {
                sbSQL.append(rsColunasTabela.getString("COLUMN_NAME")).append(" = ").append("?, ");
            }
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length()).append(" ");
        
        sbSQL.append("WHERE ");
        
        //Lista as entradas (Parâmetros / Campos Chave)
        rsChavesTabela.beforeFirst();
        while (rsChavesTabela.next()) {
            sbSQL.append(rsChavesTabela.getString("COLUMN_NAME")).append(" = ").append("? AND ");
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 5, sbSQL.length());
        
        return sbSQL.toString();
    }
    
    protected String PreparaExclusaoRegistro() throws SQLException {
        StringBuffer sbSQL = new StringBuffer();
        
        //Exclui Registro
        sbSQL.append("DELETE FROM ").append("tb_").append(this.nomeTabela).append(" ");
        
        sbSQL.append("WHERE ");
        
        //Lista as entradas (Parâmetros / Campos Chave)
        rsChavesTabela.beforeFirst();
        while (rsChavesTabela.next()) {
            sbSQL.append(rsChavesTabela.getString("COLUMN_NAME")).append(" = ").append("? AND ");
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 5, sbSQL.length()).append(" ");
        
        return sbSQL.toString();
    }
    
    protected String PreparaRecuperacaoRegistro() throws SQLException {
        StringBuffer sbSQL;
        
        //Recupera Registro
        sbSQL = new StringBuffer();
        
        sbSQL.append("SELECT ");
        
        //Lista as entradas (Campos da Tabela)
        rsColunasTabela.beforeFirst();
        while (rsColunasTabela.next()) {
            sbSQL.append(rsColunasTabela.getString("COLUMN_NAME")).append((", "));
        }   
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length()).append(" ");
        
        sbSQL.append("FROM ").append("tb_").append(this.nomeTabela).append(" ");
        
        sbSQL.append("WHERE ");
        
        //Lista as entradas (Parâmetros / Campos Chave)
        rsChavesTabela.beforeFirst();
        while (rsChavesTabela.next()) {
            sbSQL.append(rsChavesTabela.getString("COLUMN_NAME")).append(" = ").append("? AND ");
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 5, sbSQL.length());
        
        return sbSQL.toString();
    }
    
    protected LinkedHashMap<String, Object> getAtributosClasse() {
        LinkedHashMap<String, Object> lhm = new LinkedHashMap<String, Object>();
        
//        //Campos (Nomes dos atributos)
//        Field fields[] = this.tabela.getClass().getDeclaredFields();
//        for (int intCampos = 0; intCampos < fields.length; intCampos++) {
//            lhm.put(fields[intCampos].getName(), null);
//        }
        
        //Métodos (Valores dos atributos)
        Method methods[] = this.tabela.getClass().getDeclaredMethods();
        for (int intValores = 0; intValores < methods.length; intValores++) {
            if(!methods[intValores].getReturnType().equals(Void.class) && methods[intValores].getParameterTypes().length <= 0) {
                try {
                    //if (lhm.containsKey(methods[intValores].getName().substring(3, methods[intValores].getName().length()))) {
                    System.out.println("Valor do Método = " + methods[intValores].getName() + " - " + methods[intValores].invoke(this.tabela, new Object[0]));
                    if (methods[intValores].invoke(this.tabela, new Object[0]) != null) {
                        lhm.put(methods[intValores].getName().substring(3, methods[intValores].getName().length()), methods[intValores].invoke(this.tabela, new Object[0]));
                    }
                    //}
                } catch (IllegalArgumentException ex) {
                    ex.printStackTrace();
                } catch (InvocationTargetException ex) {
                    ex.printStackTrace();
                } catch (IllegalAccessException ex) {
                    ex.printStackTrace();
                }
            }
        }
        
        return lhm;
    }
    
    protected static PreparedStatement TrataParametro(final PreparedStatement pstmt, final int i, final Object Objeto) throws SQLException {
        PreparedStatement pstmt2 = pstmt;
        
        //Trata o parâmetro
        if(Objeto instanceof GregorianCalendar) {
            pstmt2.setDate(i, new java.sql.Date(((GregorianCalendar) Objeto).getTime().getTime()));
        } else if (Objeto instanceof String) {
            pstmt2.setString(i, (String) Objeto);
        } else if (Objeto instanceof Integer) {
            pstmt2.setInt(i, ((Integer) Objeto).intValue());
        } else if (Objeto instanceof Float) {
            pstmt2.setDouble(i, (Float) Objeto);
        } else if (Objeto instanceof Short) {
            pstmt2.setDouble(i, (Short) Objeto);
        } else if (Objeto instanceof Double) {
            pstmt2.setDouble(i, (Double) Objeto);
        } else {
            System.out.println("Tipo inexistente -> " + "");
            pstmt2.setObject(i, null);
        }
        
        return pstmt2;
    }
    
}

11 Respostas

D

Tire todas as ações lógicas dos métodos, mantenha apenas os nomes dos mesmos.
A partir disso, mude a assinatura para public interface.
Todos os métodos serão implementados por classes que terão a indicação implements EstaClasse

J

Fala cara…

Acredito que vc não queria transformar essa classe em interface e sim ela em uma Classe Abstrata.

Seguindo o que vc quer, coloque um Abstract na sua classe e coloque seu metodo como static que vc vai conseguir efetuar o desejado!

[]´s

K

Jovem,

Sugiro que estude um mínimo de conceitos de orientação a objeto para posteriormente, elaborar suas dúvidas.

Para que seus estudos sejam objetivos, veja o link abaixo:
http://download.oracle.com/javase/tutorial/java/concepts/index.html

P

Isso! Classe Abstrata.

Vai ficar bom dessa forma?

P

Se mudar para Classe Abstrata, como poderei passa parâmetros para oa construtor?

Esse deverão ser passados paraseus métodos. É isso?

Perdoem minha ignorância.

J

Cara, Classe Abstrata você não pode instanciar.
Se é melhor ou pior, depende muito da sua implementação, acesso concorrente e tudo mais que deve ser verificado.

Um dica realmente é dar uma estudada na Parte de POO para vc se habituar com os conceitos que isso é a base de tudo.

Para passar os parametros, vc não vai mais utilizar o construtor, vc iria passar direto via metodo!

:wink:

P

Pois é, foi o que imaginei.

Valeu!

E

Pelo que entendi você não quer usar uma instância para usar seus métodos, correto?
Se for esse o caso você pode fazer com que seus métodos se tornem estáticos, assim você não depende mais de um objeto para executar tais operações.
Exemplo:

class Teste {
    public static void facaAlgo() {
       System.out.println("faz algo");
    }
}

class Main {
    public static void main(String[] args) {
        Teste.facaAlgo(); 
    }
}

Isso se for o que eu entendi né :slight_smile:

P

Isso MERMO!

Irei fazer uso dessa prática para isso.

Valeu!

N

Cara você esta confundindo os conceitos.

Interface é uma espécie de contrato que sua classe deve seguir, um exemplo prático:
Você quer criar uma interface para Carro. Todo carro deve acelerar e freiar, então você cria uma interface:

public interface Carro{
public void acelerar(float velocidade);
public void freiar();
}

Agora você vai criar o seu carro, vamos supor que é um Gol. Para o seu Gol ser um carro, ele precisa implementar a interface carro e satisfazer os requisitos mínimos definidos pela mesma. Esses requisitos são: acelerar e freiar.

public class Gol implements Carro {
public void acelera(float velocidade) {
//faz alguma coisa
}
public void freiar() {
//faz alguma coisa
}
}

Com isso você definiu um contrato para que TODOS os carros tenham os métodos acelerar e freiar. Mas isso não quer dizer que todos os carros vão acelerar e freiar da mesma maneira. A interface obriga quem quer ser um carro a acelerar e freiar, mas como ele vai fazer isso é critério da sua classe, entendeu?

O que você quer fazer de invocar um método sem instanciar a classe refere-se a métodos estáticos. Entretanto, você não deve utilizar estes métodos sem critério somente para economizar a linhas de código.

Os livros Use a Cabeça Orientação a Objetos e Use a Cabeça Java tratam desses assuntos e são bem didáticos, vale a pena…

P

Obrigado Nycolas.

Foi bem claro.

É exatamente isso! Entendi tudo.

Mas pretendo fazer desta, uma classe que o desenvolvedor (no caso EU) passe somente o objeto de banco preenchido a conexão e diga o que sedeja fazer, se incluir, atualizar, excluir ou simplesmente ter o conteúdo do registro.

Mas valeu!

Entendi!

Ah! isso serve apenas para um determinado banco de dados por enquanto.

Isso é para uso próprio, sei que existem vários frameworks para persistir dados. Porém são muito complexos.

Criado 10 de maio de 2011
Ultima resposta 10 de mai. de 2011
Respostas 11
Participantes 6