| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 16:06:17
|
ataufo
Java Ninja
![[Avatar]](/images/avatar/14a31775d302b5e0e25caa93b6d95ff5.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 16:19:47
|
ddduran
Virtual Machine Man
![[Avatar]](/images/avatar/1239f1a40e317d2de113e7ca17f52464.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 16:20:55
|
Vmaia
JavaChild
![[Avatar]](/images/avatar/6b595bb87a53c615a535554667cfdde0.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 16:29:22
|
asaudate
GUJ Master
![[Avatar]](/images/avatar/974e2945a18e0bfb8e3aa8becac3e65c.jpg)
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?
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 16:42:03
|
Marky.Vasconcelos
Moderador
![[Avatar]](/images/avatar/04940fadf3702cbd84b7a48161037c4f.png)
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! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 17:31:48
|
ataufo
Java Ninja
![[Avatar]](/images/avatar/14a31775d302b5e0e25caa93b6d95ff5.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 18:06:34
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 18:12:38
|
ddduran
Virtual Machine Man
![[Avatar]](/images/avatar/1239f1a40e317d2de113e7ca17f52464.jpg)
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!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2010 23:47:36
|
ataufo
Java Ninja
![[Avatar]](/images/avatar/14a31775d302b5e0e25caa93b6d95ff5.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 06:00:39
|
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.)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 06:42:56
|
ataufo
Java Ninja
![[Avatar]](/images/avatar/14a31775d302b5e0e25caa93b6d95ff5.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 10:42:27
|
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
|
| Nome do arquivo |
teste.png |
Download
|
| Descrição |
Tela do programa |
| Tamanho |
352 Kbytes
|
| Baixado: |
28 vez(es) |
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 10:47:44
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 10:56:25
|
Veneno
JavaGuru
![[Avatar]](/images/avatar/d473d250193acc1cb049f2840310c2c4.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2010 13:11:30
|
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.
"
|
|
|
 |
|
|