[AJUDA] Método genérico que retorna uma instancia  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
ataufo
Java Ninja
[Avatar]

Membro desde: 21/03/2009 12:15:23
Mensagens: 267
Offline

Pessoal,

quem trabalha com PMD, encontra problemas em instanciar classes dentro de loops. Para resolver esse problema, quero criar um método genérico e estático, que retorna uma instancia de uma classe.

Tentei da seguinte forma, sem sucesso:



Não funcionou pois ele retorna um Class e não um Objeto da classe.

Alguem consegue me dar uma luz???

Obrigado.

Victor Soares
ataufo@gmail.com
[Email] [MSN] [ICQ]
ddduran
Virtual Machine Man
[Avatar]

Membro desde: 13/11/2006 16:44:54
Mensagens: 523
Offline

Cara só não funcinou por que você escolheu o metodo errado.

getClass vai te retornar a classe mesmo

tenta newInstance() e vai funcionar, des de que sua classe tenha uma construtor sem parametros
Vmaia
JavaChild
[Avatar]

Membro desde: 15/12/2007 23:36:19
Mensagens: 135
Offline

Olá,


a Classe dever ter um construtor default, deve haver outros meios, mas eu desconheço no momento.



Vmaia =D
[MSN]
asaudate
GUJ Master
[Avatar]

Membro desde: 01/09/2007 19:31:41
Mensagens: 1794
Localização: São Paulo
Offline

Vmaia wrote:Olá,


a Classe dever ter um construtor default, deve haver outros meios, mas eu desconheço no momento.




Exemplo de construção com construtores:



[]´s

Alexandre Saudate
__________________________

Do not try to bend the spoon - that's impossible. Instead, only try to realize the truth: there is no spoon.

Série quickstart: Spring+Spring Security+Jersey (REST) +Hibernate (JPA) -> https://github.com/alesaudate/kickstart-springjerseyhibernate

Evite usar Axis2!!! Leia aqui para mais detalhes!

@alesaudate
Quer ler um blog especializado em web services e SOA?

Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Um pouco além(para consulta futura)

Exemplo de construção com uma non-static inner class

Supondo que o modelo seja.


Então pra inicializar B seria.


Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
ataufo
Java Ninja
[Avatar]

Membro desde: 21/03/2009 12:15:23
Mensagens: 267
Offline

essas soluções nao funcionam pois lançam exceções e no meu projeto existe um tratamento de exceção genério, e eu teria que saber de qual camada estou chamando o getInstance...


=////////

Victor Soares
ataufo@gmail.com
[Email] [MSN] [ICQ]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Não é por nada não, mas criar um método genérico para criar uma instância de uma classe, para evitar um warning do PMD, é uma coisa podre mesmo.

O mais recomendado é, para cada classe que você precisa instanciar dentro de um loop (não estou questionando por que você tem de fazer isso; normalmente o motivo é legítimo e o warning é que é podre - já pensaram em negociar com o seu cliente desativar o tal warning? ) você criar um método estático que retorne uma instância dessa classe, e que receba os parãmetros adequados. Por exemplo:


Eu sei que vai dar um trabalhão do cão, e que vai ativar algum outro warning do PMD, mas você dispensa o uso de reflection (que é o que o pessoal está lhe mandando fazer) para criar uma instância, o que é uma coisa que vai deixar seu programa muito lento.

This message was edited 1 time. Last update was at 07/06/2010 18:07:58

ddduran
Virtual Machine Man
[Avatar]

Membro desde: 13/11/2006 16:44:54
Mensagens: 523
Offline

ataufo wrote:essas soluções nao funcionam pois lançam exceções e no meu projeto existe um tratamento de exceção genério, e eu teria que saber de qual camada estou chamando o getInstance...


=////////


Cara, meu amigo é so você tratar essas exceções no teu metodo de pegar instancia mesmo. Sei que elas deviam ser uncheck, mas o mundo java é cruel mesmo.
Caso contratrio esquece!
ataufo
Java Ninja
[Avatar]

Membro desde: 21/03/2009 12:15:23
Mensagens: 267
Offline

Galera,

primeiro, obrigado pelas opiniões...


Não é por nada não, mas criar um método genérico para criar uma instância de uma classe, para evitar um warning do PMD, é uma coisa podre mesmo.

O mais recomendado é, para cada classe que você precisa instanciar dentro de um loop (não estou questionando por que você tem de fazer isso; normalmente o motivo é legítimo e o warning é que é podre - já pensaram em negociar com o seu cliente desativar o tal warning? ) você criar um método estático que retorne uma instância dessa classe, e que receba os parãmetros adequados. Por exemplo:
view plaincopy to clipboardprint?
class Aluno {
public Aluno (final String nome, final int codigo) { .... .... }
public static Aluno getInstance (final String nome, final int codigo) {
return new Aluno (nome, codigo);
}
}
class Aluno {
public Aluno (final String nome, final int codigo) { .... .... }
public static Aluno getInstance (final String nome, final int codigo) {
return new Aluno (nome, codigo);
}
}


Eu sei que vai dar um trabalhão do cão, e que vai ativar algum outro warning do PMD, mas você dispensa o uso de reflection (que é o que o pessoal está lhe mandando fazer) para criar uma instância, o que é uma coisa que vai deixar seu programa muito lento.



Cara concordo que é ridiculo, mas já foi negociado com o cliente e NADA... Essa solução que vc falou, foi a solução que eu propus para o meu Líder, porém ele falou que teria que ser algo genérico para não botar um método desse em cada classe de negócio. Porém, acaba que a gente tem q criar vários métodos de criar instancia em vários lugares diferentes do projeto !!! É uma merda !!!!


Cara, meu amigo é so você tratar essas exceções no teu metodo de pegar instancia mesmo. Sei que elas deviam ser uncheck, mas o mundo java é cruel mesmo.
Caso contratrio esquece!


Tratar exceções eu sei, mas eu teria que lançar essa exceção por todas as camadas do projeto, não é viável...

Victor Soares
ataufo@gmail.com
[Email] [MSN] [ICQ]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

ataufo wrote:porém ele falou que teria que ser algo genérico para não botar um método desse em cada classe de negócio.


Diga a ele que métodos genéricos usam reflection e são intrinsecamente lentos e inseguros, portanto é melhor pôr um método desse em cada classe de negócio sim. O problema, obviamente, é alguém sair modificando todas as classes de negócios, o que você gostaria que fosse possível ser feito com um plugin do Eclipse ou NetBeans (assim como os "setters e getters" que ambos têm.)
ataufo
Java Ninja
[Avatar]

Membro desde: 21/03/2009 12:15:23
Mensagens: 267
Offline


Diga a ele que métodos genéricos usam reflection e são intrinsecamente lentos e inseguros, portanto é melhor pôr um método desse em cada classe de negócio sim. O problema, obviamente, é alguém sair modificando todas as classes de negócios, o que você gostaria que fosse possível ser feito com um plugin do Eclipse ou NetBeans (assim como os "setters e getters" que ambos têm.)



É mas pra eu afirmar isso eu tenho que ter algum argumento técnico, e eu não saco nada de reflection... Conhece algum lugar para eu ler sobre?

Obrigado.

Victor Soares
ataufo@gmail.com
[Email] [MSN] [ICQ]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Escrevi este programa.



Rodando este programa, podemos ver que usar um construtor genérico é MUITO mais lento. Por exemplo, para 10 milhões de iterações:

Iniciando o teste...
Executando o aquecimento (necessário para a compilação):
Agora fazendo o teste.
GetInstance levou 93 ms
generic levou 14516 ms
generic2 levou 16516 ms

[Thumb - teste.png]
 Nome do arquivo teste.png [Disk] Download
 Descrição Tela do programa
 Tamanho 352 Kbytes
 Baixado:  28 vez(es)

gustavomonarin
Smalltalk

Membro desde: 08/06/2010 10:14:42
Mensagens: 2
Offline

Este warning do PMD é exatamente para otimização de código pois a criação e o trabalho do GC para liberar a memória é muito grande.

Criando objetos por reflection deixará a criação destes objetos mais lenta ainda e ainda gerará muitos objetos na memória, isto vai apenas piorar a performance.

Um uso correto do warning seria verificar se no código estas instancias não estão sendo criadas distintas vezes em repetições distintas, e otimizar o código para isto.

Para o uso do PMD ser requisito não funcional deve ter algum responsável que entenderia que este problema poderia ser corrigido de forma a gerar mais problemas ainda. Também tente negociar os warnigs... o PMD é apenas uma ferramenta genérica e você não deve usar como regra...

segue um link interessante:

http://pmd.sourceforge.net/bestpractices.html
Veneno
JavaGuru
[Avatar]

Membro desde: 12/09/2006 11:36:42
Mensagens: 238
Offline

E se no método getInstance você tratar as excecões e disparar uma exceção do tipo RuntimeException especifica do seu projeto, aí no ponto onde você chama o getInstance, você trata essa exceção especifica?
Desta forma não precisa mexer nas outras camadas.
Isso ajuda?

Abraços!

Matheus Luis Ramos de Souza
[MSN]
gustavomonarin
Smalltalk

Membro desde: 08/06/2010 10:14:42
Mensagens: 2
Offline

trecho recortado do link enviado na mensagem anterior:

"
Best Practices
Choose the rules that are right for you

Running every ruleset will result in a huge number of rule violations, most of which will be unimportant. Having to sort through a thousand line report to find the few you're really interested in takes all the fun out of things.

Instead, start with some of the obvious rulesets - just run unusedcode and fix any unused locals and fields. Then, run basic and fix all the empty if statements and such-like. Then peruse the design and controversial rulesets and use the ones you like via a custom ruleset.
PMD rules are not set in stone

Generally, pick the ones you like, and ignore or suppress the warnings you don't like. It's just a tool.
"
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team