Em Java, é perfeitamente legal definir final
argumentos nos métodos de interface e não obedecer isso na classe de implementação, por exemplo:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
No exemplo acima, bar
e baz
possui as final
definições opostas na classe VS a interface.
Da mesma maneira, nenhuma final
restrição é imposta quando um método de classe estende outro, abstract
ou não.
Embora final
tenha algum valor prático dentro do corpo do método de classe, há algum ponto em especificar final
parâmetros de método de interface?
final
de qualquer maneira, não faz nada com tipos nativos, pois eles são copiados.interface
definições variam apenas nofinal
atributo de um argumento, os.class
arquivos resultantes são byte por byte de forma idêntica (e, é claro,javap -v
produzem a mesma saída). O mesmo vale para duas classes que diferem apenas emfinal
um atributo, a propósito!Respostas:
Parece que não faz sentido. De acordo com a Java Language Specification 4.12.4 :
No entanto, um
final
modificador em um parâmetro de método não é mencionado nas regras para correspondência de assinaturas de métodos substituídos e não tem efeito no chamador, apenas no corpo de uma implementação. Além disso, conforme observado por Robin em um comentário, ofinal
modificador em um parâmetro de método não afeta o código de bytes gerado. (Isso não é verdade para outros usos definal
.)fonte
final
modificador não é imposto à classe de implementação. Sua assinatura de interface pode simplesmente mentir.Alguns IDEs copiarão a assinatura do método abstract / interface ao inserir um método de implementação em uma subclasse.
Não acredito que faça alguma diferença para o compilador.
Edição: Embora eu acredite que isso era verdade no passado, eu não acho que os IDEs atuais façam isso mais.
fonte
static transient
campos. ;)As anotações finais dos parâmetros do método sempre são relevantes apenas para a implementação do método, nunca para o responsável pela chamada. Portanto, não há motivo real para usá-los nas assinaturas de métodos de interface. A menos que você queira seguir o mesmo padrão de codificação consistente, que requer parâmetros finais do método, em todas as assinaturas do método. Então é bom poder fazer isso.
fonte
Atualização: A resposta original abaixo foi escrita sem o entendimento completo da pergunta e, portanto, não a aborda diretamente.
:)
No entanto, deve ser informativa para quem deseja entender o uso geral dafinal
palavra-chave.Quanto à questão, gostaria de citar meu próprio comentário abaixo.
Posso pensar em duas razões pelas quais uma assinatura de método pode ter
final
parâmetros: Beans e Objetos (na verdade, ambos são a mesma razão, mas contextos ligeiramente diferentes ) .Objetos:
A
final
palavra-chave garantiu que não criaríamos acidentalmente uma nova panela local , mostrando um erro de compilação quando tentamos fazê-lo. Isso garantiu que o caldo de galinha fosse adicionado à panela original que oaddChicken
método obteve. Compare isso com o localaddVegetables
onde perdemos a couve-flor, porque ela foi adicionada a uma nova panela de cozinha local, em vez da panela original.Feijão: é o mesmo conceito que objetos (como mostrado acima) . Beans são essencialmente
Object
s em Java. No entanto, os beans (JavaBeans) são usados em vários aplicativos como uma maneira conveniente de armazenar e transmitir uma coleção definida de dados relacionados. Assim comoaddVegetables
poderia atrapalhar o processo de criação, criando uma nova panelaStringBuilder
e jogando-a fora com a couve-flor, também poderia fazer o mesmo com uma panela JavaBean .fonte
final
na interface, mas não final na implementação. Teria feito mais sentido se (a) afinal
palavra-chave não fosse permitida para argumentos do método de interface (abstrato) (mas você pode usá-la na implementação) ou (b) declarar um argumento comofinal
na interface forçaria a sua declaraçãofinal
na implementação (mas não forçado a não finais).:)
Acredito que possa ser um detalhe supérfluo, pois se é final ou não, é um detalhe de implementação.
(Mais ou menos como declarar métodos / membros em uma interface como pública.)
fonte