Desde que descobri os poderes da final
palavra - chave em Java, alguns anos atrás, isso me ajudou a tornar meus códigos muito mais legíveis, pois as pessoas podem ver facilmente o que são variáveis somente leitura. Também pode fornecer um pequeno impulso ao JIT e, embora seja muito limitado, não pode prejudicar, especialmente ao direcionar dispositivos incorporados, como plataformas Android.
Mas, acima de tudo, contribui para tornar um design mais robusto às alterações e orientar outros confirmadores quando eles precisarem modificar a base de código.
No entanto, ao navegar em parte do código-fonte do JDK, nunca encontrei essa palavra-chave, seja para classes, métodos ou variáveis. O mesmo se aplica a vários sistemas que tive que revisar.
Há uma razão? É um paradigma comum de design deixar tudo mutável por dentro?
final
campos tem a mesma semântica como escrever umvolatile
campo e, em seguida, lê-los mais tarde precisa ter semântica de leitura voláteis, isto nem sempre o que você querRespostas:
Suspeito que o motivo pelo qual você não o veja é porque o JDK foi projetado para ser estendido (é a base a partir da qual todos os seus programas são criados). Não seria incomum o código do aplicativo fazer uso dele. Também não esperaria ver muito disso no código da biblioteca (já que as bibliotecas também são projetadas para extensão).
Tente dar uma olhada em alguns bons projetos de código aberto e acho que você encontrará mais.
Em contraste com o que você vê em Java, no mundo .NET, já ouvi muitas vezes o argumento de que os clases devem ser
sealed
(semelhantes aos finais aplicados a uma classe) por padrão, e que o desenvolvedor deve desmarcar explicitamente isto.fonte
final
em campos e não em métodos. Classes imutáveis também podem ser projetadas para serem estendidas.O problema com o uso
final
de transmitir que algo é só de leitura é que ele só realmente funciona para tipos primitivos gostoint
,char
etc. Todos os objetos em Java são na verdade se refere ao uso de um ponteiro (tipo de). Como resultado, quando você usa afinal
palavra-chave em um objeto, você está dizendo apenas que a referência é somente leitura, o próprio objeto ainda é mutável.Poderia ter sido usado mais se realmente tornasse o objeto somente leitura. No C ++, é exatamente
const
isso que faz e, como resultado, é uma palavra-chave muito mais útil e muito usada.Um lugar em que uso
final
fortemente a palavra-chave é com parâmetros para evitar qualquer confusão criada por coisas como esta:Neste exemplo, parece óbvio por que isso não funciona, mas se
someMethod(FancyObject)
é grande e complicada, pode ocorrer confusão. Por que não evitá-lo?Também faz parte dos padrões de codificação Sun (ou Oracle agora, eu acho).
fonte
final
nas classes da API Java, a maioria dos objetos era imutável como em muitas bibliotecas Scala. A criação de campos de objetosfinal
torna a classe imutável em muitos casos. Esse design já é usado emBigDecimal
eString
.Concordo que a
final
palavra - chave melhora a legibilidade. Torna muito mais fácil entender quando um objeto é imutável. No entanto, em Java, é extremamente detalhado, principalmente (na minha opinião) quando usado em parâmetros. Isso não quer dizer que as pessoas não devam usá-lo porque é detalhado, mas não o usam porque é detalhado.Alguma outra linguagem, como scala, facilita muito as declarações finais ( val ). Nessas linguagens, as declarações finais podem ser mais comuns que as variáveis.
Observe que existem muitos usos diferentes da palavra-chave final. Sua postagem abrange principalmente os itens 2 e 3.
fonte
Bem, para começar, as convenções oficiais do código Java não favorecem nem proíbem o uso específico de
final
. Ou seja, os desenvolvedores do JDK podem escolher da maneira que preferirem.Não consigo ler a mente deles, mas para mim, a preferência por usar
final
ou não tem sido uma questão de foco. Uma questão de saber se tenho tempo suficiente para me concentrar completamente no código ou não .final
um lixo que apenas obscurece coisas que já são expressas com clareza suficiente no código. Parece que os desenvolvedores do JDK também se enquadram nessa categoria.Por outro lado, era totalmente oposto em outro projeto, onde passamos uma hora em média em 100 linhas de código. Lá, me vi atirando
final
como uma pistola mashine no meu e no código do outro - simplesmente porque era a maneira mais rápida de detectar uma intenção do cara que a escreveu antes de mim e, da mesma forma, a maneira mais rápida de comunicar minha própria intenção. o cara que trabalhará no meu código mais tarde.Raciocínio como acima é escorregadio. Otimização prematura pode prejudicar; Donald Knuth chega a chamá-lo de "a raiz de todo mal" . Não deixe isso te prender. Escreva código idiota .
fonte
Recentemente, descobri a alegria do recurso "Salvar ações" no Eclipse IDE. Posso forçá-lo a reformatar meu código, inserir
@Override
anotações ausentes e fazer algumas coisas bacanas, como remover parênteses desnecessários em expressões ou colocarfinal
palavras - chave em todos os lugares automaticamente sempre que pressionoctrl + S
. Eu ativei alguns desses gatilhos e, rapaz, isso ajuda muito!Acontece que muitos desses gatilhos agem como uma verificação rápida de sanidade do meu código.
ctrl + s
? - talvez eu estraguei os tipos de parâmetros em algum lugar!final
. Será que ela tem de mudar o seu valor?Descobriu-se que quanto menos variáveis mudam, menos problemas tenho no momento da depuração. Quantas vezes você seguiu o valor de alguma variável apenas para descobrir que ela muda de alguma forma, digamos 5 para 7? "Como diabos poderia ser ?!" você se pergunta e passa as próximas horas entrando e saindo de inúmeros métodos para descobrir que cometeu um erro em sua lógica. E, para corrigi-lo, é necessário adicionar mais um sinalizador, algumas condições e alterar cuidadosamente alguns valores aqui e ali.
Oh, eu odeio depurar! Cada vez que corro o depurador, sinto que meu tempo está se esgotando e preciso desesperadamente desse tempo para que pelo menos alguns dos meus sonhos de infância se tornem realidade! Para o inferno com a depuração!
final
s significa que não há mais mudanças misteriosas de valor. Maisfinal
s => partes menos frágeis no meu código => menos erros => mais tempo para fazer coisas boas!Quanto a
final
classes e métodos, eu realmente não me importo. Eu amo polimorfismo. Polimorfismo significa reutilização significa menos código significa menos bugs. A JVM faz um bom trabalho com a desirtualização e o método embutido de qualquer maneira, portanto, não vejo valor em eliminar possibilidades de reutilização de código para benefícios de desempenho insatisfatórios.Ver todos esses
final
s no código é um pouco perturbador no começo e leva tempo para se acostumar também. Alguns dos meus colegas de equipe ainda ficam muito surpresos ao ver tantasfinal
palavras-chave. Eu gostaria que houvesse uma configuração no IDE para colorir sintaxe especial. Eu ficaria feliz em mudar para um tom de cinza (como anotações) para que eles não fiquem muito perturbadores ao ler o código. Atualmente, o Eclipse tem uma cor separada parareturn
e todas as outras palavras-chave, mas não parafinal
.fonte
do
notação :) Certamente, Java não é a melhor linguagem para escrever em estilo funcional, mas pelo menos permite que você escreva um código robusto - e é com isso que realmente me importo.