Quando é indicado utilizar o modificador final na assinatura de métodos?
…
Bom, sou obrigado a discordar do amigo, pois existe sim uma indicação(finalidade), porém só para ressaltar, o modificador final não faz parte da assinatura do método, a assinatura compreende o nome do método e seus parâmetros.
Primeiro vamos a “finalidade” do modificador final em um método:
O método final não pode ser sobrescrito por uma classe que extenda a classe possuídora do método.
Sendo assim se você quer que um método não tenha um comportamento específico em uma
classe “filha”, marque ele como “final”, um bom exemplo são os métodos da classe String os quais não podem ser “sobrescritos”.
Você deve usar final, necessariamente:
- Em métodos não privados, que estejam sendo usados no construtor;
- Em métodos onde você não deseja sobrescrita.
Há um mito de que o final torna a performance do método maior, mas um estudo detalhado com profilings já me mostrou que o ganho é despresível, se é que existe.
e quando é indicado utilizá-lo nos parâmetros que o método recebe?
Quando você quiser evitar modificar o valor do parâmetro por acidente.
- Lembrando que modificar o parâmetro dentro do método não tem qualquer efeito sobre o valor do que foi passado naquele parâmetro fora do método.
- E que parâmetros que representam objetos são referências. O final só evita que se modifique o valor da referência, não o objeto para o qual ela aponta.
Obrigada por esclarecer Vini, mas então… estive lendo que é considerado má prática re-atribuir valores recebidos como parâmetros, procede? Tenho colegas que utilizam o final em todos os parâmetros de todos os métodos e dizem ser uma boa prática.
[quote=sgaothaich]Obrigada por esclarecer Vini, mas então… estive lendo que é considerado má prática re-atribuir valores recebidos como parâmetros, procede? Tenho colegas que utilizam o final em todos os parâmetros de todos os métodos e dizem ser uma boa prática.
[/quote]
Discordo. Você pode simplesmente modificar um objeto por referência.
Envio uma lista como parâmetro, adiciono/modifico seu conteúdo e ao invés de retornar uma nova lista, você simplesmente continua usando ela no código que invocou o método. Exemplo disso é aAPI Collections. O método sort() retorna uma nova Collection ou simplesmente modifica a original através de referência?
Se for uma má prática, o pessoal da Oracle precisa revisar então, concorda?
Não é assim que funciona. Eu acho importante, por exemplo, quando se quer realizar uma busca pela chave primária. Você passa e adicionar o final garante que a busca será exclusivamente pela chave passada, sem a possibilidade da implementação do método modificar esse valor.
Se o parâmetro for um objeto, reatribui-lo é uma operação que não faz qualquer sentido.
Se não for, você pode usar o parâmetro como uma variável temporária.
Mas há quem realmente considere isso uma má prática e realmente coloque final em tudo.
Entretanto, eu não consideraria isso uma prática tão crítica.
[quote=ViniGodoy]Se o parâmetro for um objeto, reatribui-lo é uma operação que não faz qualquer sentido.
Se não for, você pode usar o parâmetro como uma variável temporária.
Mas há quem realmente considere isso uma má prática e realmente coloque final em tudo.
Entretanto, eu não consideraria isso uma prática tão crítica.[/quote]
Mas Vini, você concorda em que deve-se adicionar final a todos os parâmetros? Eu discordo, pois acredito que há pontos em que possam vir a ser necessário e outros desnecessário, o que leva o desenvolvedor a realizar uma análise da necessidade de tal modificador. Gostaria de ler sua opinião.
Abraços.
Não faz muita diferença.
Alterar um parâmetro dentro da função não tem qualquer efeito sobre o valor da respectiva variável fora da função.
Eu acho que colocar final em todos os parâmetros é preciosismo.
[quote=ViniGodoy]Não faz muita diferença.
Alterar um parâmetro dentro da função não tem qualquer efeito sobre o valor da respectiva variável fora da função.
Eu acho que colocar final em todos os parâmetros é preciosismo.[/quote]
Compartilho da mesma opinião.