Por que alguém declararia um método de interface Java como abstrato?


143

Eu usei o recurso de refatoração "pull interface" do Eclipse hoje para criar uma interface baseada em uma classe existente. A caixa de diálogo oferecida para criar todos os novos métodos da nova interface como métodos "abstratos".

Qual seria o benefício disso?

Eu pensei que o fato de você poder declarar métodos de interface como abstratos era um recurso supérfluo e inofensivo da linguagem que não é particularmente incentivado.

Por que o Eclipse suportaria esse estilo ou por que alguém escolheria voluntariamente fazê-lo?

Esclarecimento: Não estou perguntando por que os métodos de interface são abstratos, isso é óbvio. Estou perguntando por que alguém escolheria explicitamente marcá-los como abstratos, pois se eles estiverem em uma interface, serão abstratos de qualquer maneira.

Respostas:


146

De acordo com a Java Language Specification , a abstractpalavra - chave para interfaces é obsoleta e não deve mais ser usada. (Seção 9.1.1.1)

Dito isto, com a propensão do Java à compatibilidade com versões anteriores, eu realmente duvido que alguma vez faça diferença se a abstractpalavra-chave está presente.


1
Esse era o meu entendimento (embora eu não estivesse familiarizado com a seção JLS específica). Eu estou perguntando por que Eclipse iria me oferecer a opção de criar um obselete marcação ...
Uri

Me pegou. Alguém em algum lugar mosto de decidiu que era um "recurso" desejável e colocá-lo em Você sabe, um desses tipos de código aberto astutos :).
jdmichal

18
Embora essa seja a resposta com a melhor classificação, ela está se referindo à seção incorreta da especificação; 9.1.1.1 está descrevendo a abstractpalavra-chave na declaração da própria interface, não em seus membros. A resposta de @ Will abaixo está correta e também contém fontes de links válidas.
Shaggy Frog

39

"O benefício disso" (adicionar resumo na declaração de métodos de interface) no eclipse seria um antigo problema de compatibilidade com o compilador jdt eclipse no jdk1.3

Desde a versão 1.4, as bibliotecas jdk não contêm mais métodos abstratos padrão (em classes abstratas implementando interfaces).
Isso está enganando o diagnóstico do compilador Eclipse 1.3, pois sua implementação depende de sua existência.
Observe que o Javac 1.3 se recusaria totalmente a executar as bibliotecas 1.4 (usando a opção -bootclasspath).

Como o compilador Eclipse provavelmente está no nível de conformidade 1.4 (consulte Workbench>Preferences>Java>Compiler>JDK Compliance), ou usa pelo menos 1.3 bibliotecas de classes se estiver usando o modo de conformidade 1.3, a presença de "resumo" não é necessária na maioria dos projetos atuais do eclipse.


3
Boa descoberta. Portanto, é funcionalidade solucionar um problema não mais existente no compilador Eclipse.
jdmichal

1
@jdmichal: exatamente, e também é uma resposta mais precisa à pergunta de Uri.
VonC 16/03/09

39

No Java SE 7 JLS (Java Language Specification): "É permitido, mas desencorajado por uma questão de estilo, especificar de forma redundante o modificador público e / ou abstrato para um método declarado em uma interface".

Para o Java SE 5.0 : "Para compatibilidade com versões mais antigas da plataforma Java, é permitido, mas por desencorajar, por uma questão de estilo, especificar de forma redundante o modificador abstrato para os métodos declarados nas interfaces".


9

De acordo com os métodos JLS nas interfaces, são abstratos por padrão, portanto a palavra-chave é redundante. Sabendo disso, eu nunca o usaria para "evitar confusão de apresentação".


Essa deve ser a resposta certa. Aqui está uma versão atualizada ligação - Veja a "Nota" seção
Mork

O JLS não diz que a palavra-chave é obsoleta para métodos em interfaces. Diz "É permitido, mas desencorajado por uma questão de estilo, especificar de forma redundante o modificador público e / ou abstrato para um método declarado em uma interface". JLS # 9.4 .
Marquês de Lorne

@EJP Eu não disse que o JLS declarou que a palavra-chave seria obsoleta, esta era minha opinião pessoal;) BTW, eles observam que essa palavra-chave é "redundante", o que não é exatamente o mesmo que obsoleta, pois você está certo, é claro . Agora que sei que vou editar a resposta para esclarecer isso.
Daniel Hiller #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.