Estou usando o PMD (Framework de Qualidade Automática), e os avisos que mais aparecem nos meus códigos são: “Local variable could be declared final” e “Parameter ‘xxx’ is not assigned and could be declared final”
Num simples código como:
public void setNome(String nome) {
this.nome = nome;
}
aparece a mensagem: [color=red]“Parameter ‘nome’ is not assigned and could be declared final”[/color]
e no código:
public Objeto fazAlgo(){
Objeto obj = new Objeto();
obj.fazAlgo();
return obj;
}
Aparece: [color=red]“Local variable ‘obj’ could be declared final”[/color]
No site do PMD essa regra aparece na categoria de otimização.
Minha pergunta é… Eu realmente preciso me preocupar com isso? Os compiladores já não fazem essas otimizações automaticamente?
Os compiladores não fazem isso, ainda mais que variaveis locais final só fazem diferença se forem constantes ou se existirem inner classes na jogada.
Porém você não está perdendo nada em não fazer isso. É apenas uma práticas que algumas pessoas dizem que é bom. Fica por sua conta julgar se cabe ou não fazer.
A
AllMighty
Eu acho besteira fazer esse tipo de coisa como otimização de performance a não ser que você tenha certeza absoluta que precisa de mais performance e não tem outro jeito mais inteligente de conseguir (como mudar o algoritmo, reduzir contenção em locks, ou alguma outra coisa que o profiler te sugira).
Por outro lado é certamente uma boa prática minimizar o estado mutável nos seus programas e o modificador final é um jeito de ajudar o compilador a te avisar quando você viola essa regra. O Josh Bloch (do Effective Java) disse no último JavaOne que ele recomenda usar final como o padrão para campos, assim como ele já recomendava usar o private como padrão.
Sami_Koivu
Concordo, acho que faz o código mais legível e ajuda evitar erros. Ao mesmo tempo é um trabalho definir explicitamente todos os campos como final. O ganho em ambos casos, acho, é proporcional ao escopo do variável (ou campo, etc). E assim num simples setter onde o escopo de um parâmetro é uma linha de código talvez o trabalho de escrever aquele final não valha a pena.
[]s,
Sami
A
AllMighty
Acho que não vem muito ao caso aqui, mas é legal comparar com outras linguagens. Scala tem duas keyword separadas para valores e variáveis:
vari=0//Umavariávelnormalvali=0//Umvalorimutável
(Eu não declarei os tipos pq Scala suporta inferência de tipos).
fcmartins
No livro do Brian Goetz, " Java Concurrency in Practice", uma das boas práticas apresentadas para tornar seu código thread-safe é sempre declarar variáveis de instância/classe como “final” e só remover o modificador se houver mesmo a necessidade.
Em princípio, não há problemas em expor variáveis “final” para múltiplas threads, já que elas são imutáveis.
T
thingol
Aqui o pessoal até tinha pensado em tirar essa regra do PMD, mas descobrimos que vários programadores ficavam reaproveitando parãmetros de métodos e os usando como variáveis de uso geral - argh! (Imagine que confusão isso dava na hora de debugar os programas).
Então voltamos a forçar que os parâmetros fossem “final” e fazer com que os programadores criassem variáveis locais direitinho.