PMD Maluco

Pessoal,

Instalei o PMD no Eclipse, a versão mais recente que tinha, e olhe só que esquisito:

Para este código:

Integer amount = new Integer(amountRegister);

Ele aponta este erro:

Isto esta estranho mesmo ou eu que não estou enxergando algo?

Qual comportamento esquisito você está reparando? Você está instanciando um Integer e ele diz para não fazer isso.

http://pmd.sourceforge.net/rules/index.html

Estou no JDK 1.4.2, e a variável amoutRegister é um int…

É uma regra de migração, quer dizer que vai tornar mais fácil migrar pra Java 5. Lleia a documentação do PMD. de qualquer modo você pode desativar a regra.

Ah, e o fato de ser um int não elimina o fato de você estar instanciando um Integer, seja com um int ou com qualquer coisa.

Hum… acho que por isso que o pessoal aqui tem um ruleset definido :stuck_out_tongue:

O fato é que neste caso não tem como evitar, vou ter que instanciar o Integer.

Vou desativar essa regra.

Sei não, einh.

A diferença entre fazer

Integer a = new Integer(0);

e fazer

é a mesma diferença entre fazer

String a = new String("Java");

e fazer

String a = "Java";

No primeiro caso, você aloca um novo objeto em memória (duhhh!) com um determinado valor associado (0/“Java”). Para o segundo caso, a JVM faz um poolzinho, fazendo com que o valor associado ao novo objeto seja reaproveitado a partir do valor de um outro objeto equivalente, e por isso o mala do PMD considera esta prática mais “memory friendly”.

Também concordo,
fazer isso Integer.valueOf(0); um bilhão de vezes é mais performático
que criar um novo objeto na memória new Integer(0); já que as duas formas de obter um integer tem a mesma representação semântica.

Se eu não me engano, o Integer.valueOf() foi alterado para usar um flyweight para melhorar a performance do autoboxing.

Pessoal… acho que vocês estão se equivocando, o valueOf recebe uma String, não um int.

O valueOf() aceita tanto uma String quanto um int.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#valueOf(int)

[quote=David]O valueOf() aceita tanto uma String quanto um int.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#valueOf(int)[/quote]

Aparti do Java 5 só. http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html#valueOf(java.lang.String)

Tive esse mesmo problema e a solução foi desabilitar essa regra.
No JDK 1.4 se vc tem um int e quer um Integer o único modo de fazer isso é esse.
No meu caso ainda tinha aquele cara que defende o pmd tentando me convencer que o ideal seria:

    int a = 4;
    Integer b = Integer.valueOf( "" + a);

só para “agradar” ao pmd…
:shock:

Que nojo… É igual àquela regra dos “números mágicos”. Dá para enganar essa regra para números entre 4 e 65535, usando caracteres em Unicode:

int ultimoDigito = valor % 10; // o PMD, ou Checkstyle, não sei, vai reclamar

em vez disso usar isto, que é altamente críptico:

int ultimoDigito = valor % '\n'; // fica mudo e calado

Enganar regras do PMD ou Checkstyle é possível, mas torna os programas ininteligíveis. É melhor desabilitar algumas regras, já que o que se quer é algo que as pessoas possam entender.

Não é melhor se preparar pra uma migração?

Já trabalhei num sistema cuko único empecilho para não migrar era o fato de que alguém usou enum como identificador em 99% dos fontes (sim, era um sistema mal feito pra cacete) e nenhum projeto ia querer bancar o processo de alteração e de teste integral do sistema (que durava uns dois meses).

Você garante que o sistema funciona no Java 5?

Uh?

Só funcionará no 5. :smiley:

Não fui bem claro:

Você garante que o sistema já desenvolvido garante no Java 1.5?

[quote=microfilo]Não fui bem claro:

Você garante que o sistema já desenvolvido garante no Java 1.5?[/quote]

Agora você não foi nem um pouco claro :smiley:

Pelo contexto eu imagino que sua pergutna seria: você garante que seu sistema funcionaria no Java 5?

Não sem passar por QA. A diferença é que não há nenhuma alteração nos fontes para,t eoricamente, funcionar no Java 5, então a qualquer momento a migração pode ser feita, com custo apenas de teste e evetual correção.

Utilizando técnicas que dificultam a migração temos o esforço inicial de fazer o sistema mesmo compilar em Java 5.