Duvida sobre "funcoes"

6 respostas
K

Qual a maneira correta de usar um method ou alguns methods que tenho para validar CNPJ, IE, CCM e etc...

Eu criei uma classe com este methods e instancio esta classe e utilizo este methods com argumentos.

Exemplo:

public class Funcoes {

public boolean validaCNPJ(<arg>) {
   // restoda programacao
}

public boolean validaIE(<arg>) {
   // resto da programacao
}

}

usando a classe:

public class CadastroCliente {

Funcoes funcoes = new Funcoes();

if (funcoes.validaCNPJ(<arg>)) 
    System.out.println("CNPJ valido");
else
    System.out.println("CNPJ invalido");

}

Mas nao seria correto usar implements

public class CadastroCliente implements Funcoes {

   public CadastroCliente() {

            validaCNPJ(<arg>);

   }

}

Agradeço a ajuda.

6 Respostas

rafadelnero

Crie classes de CNPJ, IE, CCM e crie métodos de validação dentro dessas classes, fica mais prático, e é considerado boa prática.

TerraSkilll

Correto ou incorreto depende mais de como você do que de uma regra pré-estabelecida. Mas o seu entendimento tem algumas falhas que tornam a coisa mais confusa, então vamos por partes:

Primeiro, o implements só poderia ser usado se Funcoes fosse uma interface (não uma classe). Sendo uma interface, seus métodos serão vazios:

public interface Funcoes{
public boolean validaCNPJ(<args>);
public boolean validaIE(<args>);
}
Se CadastroCliente fosse implementar Funcoes, dentro de cadastro de clientes você teria de escrever o código de cada uma desses métodos. E se criar uma classe CadastroFornecedor, também, e assim sucessivamente. E note que, no caso dessas validações, o código não muda. Para a validação de CNPJ, não importa se o cnpj é de um cliente ou de um fornecedor, o código é essencialmente o mesmo:
public class CadastroCliente implements Funcoes {  
  public CadastroCliente() {  
    validaCNPJ(<arg>);
  }
  @Override
  public boolean validaCNPJ(<args>){
    // você é obrigado à colocar o método aqui porque o contrato com a classe Funcoes obriga essa declaração
  }
  @Override
  public boolean validaIE(<args>){
    // você é obrigado à colocar o método  aqui porque o contrato com a classe Funcoes obriga essa declaração
  }
}
public class CadastroFornecedor implements Funcoes {  
  public CadastroFornecedor () {  
    validaCNPJ(<arg>);
  }
  @Override
  public boolean validaCNPJ(<args>){
    // você é obrigado à colocar o método aqui porque o contrato com a classe Funcoes obriga essa declaração
  }
  @Override
  public boolean validaIE(<args>){
    // você é obrigado à colocar o método aqui porque o contrato com a classe Funcoes obriga essa declaração
  }
}

Então, nesse contexto, vale pouco a pena que um CadastroCliente implemente Funcoes. Do mesmo modo, note que os métodos da classe Funcoes possivelmente não mudam e independem do estado geral da classe Funcoes (que os contém), ou seja, o método validaCNPJ() vai validar uma entrada qualquer independente de um objeto do tipo Funcoes. Dito isso (novamente, nesse contexto), vale a pena que os métodos da classe funções sejam estáticos, o que tira a necessidade de você criar uma instância da classe Funcoes para usá-los.

public class Funcoes{
public static boolean validaCNPJ(<args>){

}

public static boolean validaIE(<args>){

}
}
public class CadastroCliente {
(...)
    if (Funcoes.validaCNPJ(<arg>)) // note que, aqui, Funcoes se refere à classe, não à uma instância dela
        System.out.println("CNPJ valido");  
    else  
        System.out.println("CNPJ invalido");  
    }
(...)

Abraço.

K

Blz, entendi o conceito de implements, nao tem nada haver com o que eu queria fazer.

valeu msm pela ajuda, aproveitando o gancho, uma duvida sobre static, isso nao come mais memoria, msm sendo “virtual”… static nao faria esta classe estar sempre carregada pronta para ser chamada ?

Estou perguntando isso pq em outras linguagens mais antigas, era isso q acontecia.

Abs.

rafadelnero

Ela vai ser carregada somente se você usar ela uma vez, se não não vai. Mas ela ficará sim na memória até você encerrar a aplicação, caso use essa classe de alguma forma, não precisa instanciar a classe pra ela ser carregada, basta fazer uma chamada de um método estático dessa classe que ela já será carregada.

A

Eu recomendo a primeira solução proposta pelo rafadelnero.

Vejo muitas vantagens na criação de tipos específicos, que se auto validam, no design de um sistema.

K

Agradeço a todos pela ajuda !

Criado 9 de maio de 2014
Ultima resposta 10 de mai. de 2014
Respostas 6
Participantes 4