Classe recicladora de Objeto

7 respostas
charleston10

Olá galera,
Estive pensando em criar uma classe recicladora de outras classe, como assim? e por quê?

Tive a necessidade de fazer isso, pois os meus projetos pareciam que estavam muito sujos ao criar,
por exemplo numa classe eu tinha que fazer várias importações e criar vários objetos de outras classes
pois eu uso várias ferramentas feita por mim mesmo, então tinha que criar 10 objetos dentro duma classe..

Pra mim achei que fica muito ruim, então o que eu resolvi fazer é criar uma classe onde dentro dela, eu crio
todos objetos necessários para toda aplicação assim toda vez que eu for utilizar qlqr objeto eu chamo o objeto
principal, é como se fosse uma cadeia..

ficaria assim;

/**
 * @description Classe onde contém todos objetos do projeto, para uso
 *              no objeto global.
 */
package classes;

import classes.componentes.clsFormulario;

/**
 * @data 27/11/2012
 * @author Charleston Anjos
 * @version 12.101
 * @alteração 28/11/2012
 */
public class clsObjeto{

    public clsFormulario formulario = new clsFormulario();
    public clsComandos comandos = new clsComandos();    
    public clsMensagens mensagens = new clsMensagens();
    public clsCSV csv = new clsCSV();
    public clsCriptografia criptografia = new clsCriptografia();

}

Quando eu for utilizar em qualquer outra classe

deste modo eu nao tenho q ficar criando varios objetos na minha classe ta funcionando belezinha..
public class Teste(){
       clsObjeto objeto = new clsObjeto();

       objeto.mensagens.enviarMensagem("nova mensagem");
       objeto.comando.testar();
       objeto.criptografia.criptografar("texto a ser criptografado");
}

O problema ta aki...

/**
 * @data 28/11/2012
 * @author Charleston Anjos
 * @version 12.101
 * @alteração 28/11/2012
 */
public class clsCSV implements interfaces.interfaceCSV {

    private clsObjeto objeto = new clsObjeto();

    public void CriaCSV() throws Exception {
        
        try{

            //Criação de um buffer para a escrita em uma stream
            BufferedWriter StrW = new BufferedWriter(new FileWriter("C:\\tabela.csv"));

            //Escrita dos dados da tabela
            StrW.write(objeto.criptografia.Criptografar("Nome;Telefone;Idade\n"));
            StrW.write(objeto.criptografia.Criptografar("Juliana;6783-8490;23\n"));
            StrW.write(objeto.criptografia.Criptografar("Tatiana;6743-7480;45\n"));
            StrW.write(objeto.criptografia.Criptografar("Janice;6909-9380;21"));

            //Fechamos o buffer
            StrW.close();

        }catch (FileNotFoundException ex){
            ex.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

Ocorre esse erro

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at classes.clsCSV.(clsCSV.java:21)
at classes.clsObjeto.(clsObjeto.java:20)

7 Respostas

rmendes08

Cara, essa sua idéia de fabricar TODOS os objetos dentro de uma única classe é horrível, pois você está gerando um acoplamento completamente desnecessário, além de que você não teria esse problema que você está tendo agora …

Bom, explicando o erro. Uma StackOverflowError acontece quando a chamada de métodos é infinita. É um erro muito comum em métodos recursivos, onde a pessoa esquece de tratar o caso base, por exemplo:

int fibo(int n){
   return fibo(n-1) + (n-2);
}

No seu caso o erro acontece por conta disso:

public class clsObjeto{  
    public clsCSV csv = new clsCSV();
  
}

Ou seja, a classe clsObjeto cria um instância da classe clsCSV. Por sua vez:

public class clsCSV implements interfaces.interfaceCSV {  
  
    private clsObjeto objeto = new clsObjeto();  

   //...
}

a classe clsCSV cria ela mesma um instância de clsObjeto. Sendo assim, fica a pergunta: quem vem primeiro, o ovo ou a galinha ? Ou seja, quando você cria um objeto da clsObjeto a JVM entra na ciranda:

clsObjeto() -> clsCSV() -> clsObjeto() -> clsCSV() …

até que a Stack se esgote.

Outra sugestão, procure seguir as convenções da linguagem, não há necessidade alguma de colocar o prefixo cls antes dos nomes das classes, isso só dificulta a leitura.

E

Pelo jeito o Charleston foi, em alguma fase da vida, programador de fábrica de software de VB 6, é isso?

Só gente que fez isso tem essa mania de botar “cls” como prefixo de nome de classe.

Em Java não é costume botar prefixos nos nomes de variáveis, classes etc (o que se chama de “notação húngara”, porque esse padrão foi usado em C devido a um programador de origem húngara da Microsoft, Charles Simonyi.) Hoje em dia, tal padrão caiu em desuso.

Quem tem de dizer que alguma coisa é classe, variável etc. é a IDE, não o nome do identificador.

charleston10

Mas pq seria desnecessário ??!

Eu entendi agora o “por que”… valeu… \o/

Sabe como eu poderia arrumar isso ai ?’

Não coloco o nome pq está fora ou não do padrão…
Acho que pra mim fica mais facil identificar um arquivo na minha aplicação…

charleston10

O jeito é fazer uma biblioteca ?
Ou não tem outra maneira… ?’

A

Você conhece os containers de injeção de dependência?

Spring, Guice, etc?

Acredito que eles possam te ajudar nisso.

rmendes08

charleston10:
Mas pq seria desnecessário ??!

Eu entendi agora o “por que”… valeu… \o/

Sabe como eu poderia arrumar isso ai ?’

Não coloco o nome pq está fora ou não do padrão…
Acho que pra mim fica mais facil identificar um arquivo na minha aplicação…

Ora, mas em Java todo arquivo é uma classe! Tudo bem, pode ser uma interface, mas a idéia é justamente que classes e interfaces possam ser usadas uma no lugar da outra!.

E

As convenções do Java são muito diferentes das convenções do VB 6, que é o que aparentemente você está seguindo. Nomes de classes e interfaces sempre começam por maiúsculas, nomes de métodos sempre começam por minúsculas, não se usam normalmente underscores ("_") em nomes (exceto no caso de constantes), etc. Procure por “Java Code Conventions”.

Se você deseja criar todos os objetos “por fora” para que eles fiquem disponíveis para as classes da aplicação, use singletons, ou melhor ainda, junte as partes da sua aplicação usando o Spring Framework. Não faça tal coisa esquisita, que parece coisa de programador VB 6.

Criado 28 de novembro de 2012
Ultima resposta 28 de nov. de 2012
Respostas 7
Participantes 4