[RESOLVIDO]como instanciar o mesmo objeto em outra classe sem usar o static

Bom, galera em minha jornada em busca de conhecimento na arte de programar usando Orientação a Objetos com a linguagem java, deparei-me em um obstáculo ao qual tenho quebrado minha cabeça para resolver. Como Instanciar o mesmo objeto em classes diferentes. Vocês podem se perguntar: “Por que tu não colocas no google e verás vários exemplos”. Bom pesquisei no google e no fórum aqui, fiz singletrom, tentei entender Gof, mas não era isso que eu procurava. Então resolvi buscar esclarecimento através deste fórum. Bom seguem minhas dúvidas:

Eu uso muitos métodos e variáveis estáticas para acessar a mesma estancia de uma classe (JinternalFrame) através de outra, usando esse método (static) tudo funciona normal, meu programa de aprendizado roda bem. Mas ai eu caio no paradigma da Orientação a Objetos, que se você usa muitos Objetos e variáveis static seu código não é orientado a objetos é orientado a “gambiarra”. Então resolvi mudar, retirei todos os métodos e variáveis estáticas e fui quebrar a cabeça para ter acesso a mesma estância da classe pai pela classe filha. Só que não consigo ter acesso, sempre é criado um novo objeto com novos atributos. O que gera o seguinte erro quando tento compilar:

Compra inserida com sucesso! cliente44

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Testes.TesteManipulacaoComprasGUI.bOKActionPerformed(TesteManipulacaoComprasGUI.java:251)
	at Testes.TesteManipulacaoComprasGUI.access$100(TesteManipulacaoComprasGUI.java:25)
	at Testes.TesteManipulacaoComprasGUI$2.actionPerformed(TesteManipulacaoComprasGUI.java:148)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6504)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6269)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4860)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Como pode ser visto a compra é inserida pelo DAO corretamente, mas a jtable a qual eu faço referência não é atualizada, pois a linha:

Retorna como null, ou seja está se criando uma nova estância da classe.

vou passar o contrutor da classe filha:

public TesteManipulacaoComprasGUI(ComprasGUIteste comprasGUIteste) throws SQLException {
        this.comprasGUIteste = new ComprasGUIteste();
        initComponents();
        
        //pega a data atual do sistema e joga no tfData.
        tfData.setDate(new java.util.Date());
    }

Bom galera aqui vai minhas perguntas:

1º Usar esse tanto de static, mesmo sendo para GUI, fere a orientação a objetos??

2º Como posso ter acesso a mesma instância onde está minha tabela através de outra JinternalFrame, sem usar static?? (um exemplo simples seria muito bem vindo)

Agradeço a todos.

alguém???

Digamos que você tenha um objeto onde você vai pôr todas as coisas que as janelas do seu programa desejam acessar. Digamos que a classe desse objeto seja “TodasAsCoisasClass”.

Você pode fazer o seguinte:
a) Na classe principal do seu programa, crie um objeto dessa classe
b) Para cada janela que você criar e que precisar acessar essa classe, você passa esse objeto (ou com um setter, ou como argumento do construtor). Por exemplo:

Assim você vai ter dois benefícios:

a) Todas as coisas que são “globais” no seu programa ficam concentradas em uma classe só, em vez de ficarem "static"
b) Se você precisar fazer um teste unitário de cada classe, pode passar esse objeto TodasAsCoisas preenchido com as coisas que essa classe precisa, em vez de ter de rodar seu programa desde o começo

TodasAsCoisasClass tacc = new TodasAsCoisasClass();
....
....
CadastroDialog cd = new CadastroDialog (tacc);
cd.setModal (true);
cd.setVisible (true);
....

Cara eu não entendi muito bem, mas vou tentar colocar seu pensamento em pratica.

Pergunta: isso não vai usar muita memoria???

Tem alguma dica de como pesquisar no google sobre isso?? acho que eu não tô é sabendo procurar.

[quote=psicoppardo]Cara eu não entendi muito bem, mas vou tentar colocar seu pensamento em pratica.

Pergunta: isso não vai usar muita memoria???

Tem alguma dica de como pesquisar no google sobre isso?? acho que eu não tô é sabendo procurar.[/quote]

Usa exatamente a mesma quantidade de se você usar um static, já que passar um objeto para outro método ou outra classe é só passar a referência, não os dados completos.

Melhor não ficar usando muito static porque dá sempre problemas chatos de resolver depois.

A dica que posso te dar é se for para alterar um componente de interface então crie esse método na própria classe que cria a interface, então use Singleton para gravar a instancia dessa classe. Agora caso for um método que não esteja diretamente ligado a essa classe(exemplo: funções diversas como realizar um calculo, formatar uma data ou algum outro método genérico) então crie uma outra classe podendo usar métodos estáticos.
Bom fim de semana, flw!

Não sei se entendi bem, mas parece que você quer alterar sua tela a partir do DAO ???

Se for realmente fazer isso, crie uma interface com um método adicionarLinhaTabela por exemplo e crie uma classe que implemente essa interface e receba no construtor ou por set ou outra forma de injeção a dependência da instância da GUI. Então implemente o comportamento nesta classe.

Ao acessar o DAO, crie uma dependência com essa interface e injete a implementação.

Dessa forma você desacopla o DAO da interface.

Você também pode voltar uma lista e ter uma classe que manipula a interface.

Tem diversas formas de se fazer isso e não existe uma forma melhor/unica!

[quote=jmmenezes]Não sei se entendi bem, mas parece que você quer alterar sua tela a partir do DAO ???

Se for realmente fazer isso, crie uma interface com um método adicionarLinhaTabela por exemplo e crie uma classe que implemente essa interface e receba no construtor ou por set ou outra forma de injeção a dependência da instância da GUI. Então implemente o comportamento nesta classe.

Ao acessar o DAO, crie uma dependência com essa interface e injete a implementação.

Dessa forma você desacopla o DAO da interface.

Você também pode voltar uma lista e ter uma classe que manipula a interface.

Tem diversas formas de se fazer isso e não existe uma forma melhor/unica![/quote]

Não manipulo a interface GUI através do DAO, apenas faço operações de CRUD pelo DAO. O método que mostrei está em uma classe que herda da classe BaseDAO, que é generica, e as classe GUI são outras que posso fazer referencia para a classes DAO.

Concordo com o Ivan Alves. Minha situação é específica para a parte visual, não é bom manipular Diretamente no Dão. Prefiro separar a parte visual do Dão. Grato a todos pela a Ajuda. Pelo q entendi o Caminho é usar Singletron. Valeu galera vou pesquisar material dedicado a essa abordagem.

Usar singleton para guardar a instancia da classe nao eh o ideal. O ideal eh usar injecao de dependencia e fazer a depencia baseada em interface.
Alterar a tela a partir do DAO pode ser necessario em alguns casos, onde precisa-se por exemplo de uma barra de progresso. Nesse caso se cria uma interface IBarraProgresso e a implementacao desta que fica acoplada a tela e nao o DAO. Nos outros casos fazer o DAO voltar listas e desacoplar da interface eh o ideal!

Acho que nao consegui explicar direito…

Como usar injeção de dependência em uma aplicação DESKTOP, eu pensei que Spring fosse só Web, se tiver um jeito de implementar o padrão gostaria de um exemplo se fosse possível com Swing.

Galera pesquisando muito no forum achei uma explicação que solucionou minha dúvida, essa explicação está no linkhttp://www.guj.com.br/java/235333-meu-primeiro-tutorial-passando-valores-para-outro-jframe

Obrigado a todos pelas explicações. tópico resolvido