Interface abstrata Java

Considere um exemplo (que compila em java)

public abstract interface Interface { public void interfacing(); public abstract boolean interfacing(boolean really); } 

Por que é necessário que uma interface seja “declarada” abstrata? Existem outras regras que se aplicam a uma interface abstrata?


Finalmente: Se o abstract estiver obsoleto, por que ele está incluído no Java? Existe um histórico para interface abstrata?

Por que é necessário que uma interface seja “declarada” abstrata?

Não é.

 public abstract interface Interface { \___.__/ | '----> Neither this... public void interfacing(); public abstract boolean interfacing(boolean really); \___.__/ | '----> nor this, are necessary. } 

Interfaces e seus methods são implicitamente abstract e adicionando que o modificador não faz diferença.

Existem outras regras que se aplicam a uma interface abstrata?

Não, as mesmas regras se aplicam. O método deve ser implementado por qualquer class de implementação (concreta).

Se o resumo estiver obsoleto, por que ele está incluído em Java? Existe um histórico para interface abstrata?

Pergunta interessante. Eu desenterrei a primeira edição do JLS, e até lá está escrito “Esse modificador é obsoleto e não deve ser usado em novos programas Java” .

Ok, cavando ainda mais … Depois de encontrar vários links quebrados, consegui encontrar uma cópia da especificação original do Oak 0.2 (ou “manual”). Muito interessante ler devo dizer, e apenas 38 páginas no total! 🙂

Na Seção 5, Interfaces, fornece o seguinte exemplo:

 public interface Storing { void freezeDry(Stream s) = 0; void reconstitute(Stream s) = 0; } 

E na margem diz

No futuro, a parte “= 0” de declarar methods em interfaces pode desaparecer.

Assumindo que =0 foi substituído pela palavra-chave abstract , suspeito que o abstract foi em algum momento obrigatório para methods de interface!


Artigo relacionado: Java: interfaces abstratas e methods de interface abstrata

Não é necessário, é opcional, tão public quanto public methods de interface.

Veja o JLS sobre isso:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 Interfaces abstratas Toda interface é implicitamente abstrata. Este modificador é obsoleto e não deve ser usado em novos programas.

E

9.4 Declarações abstratas de método

[…]

Para compatibilidade com versões mais antigas da plataforma Java, é permitido, mas desencorajado, por uma questão de estilo, especificar de forma redundante o modificador abstrato para methods declarados em interfaces.

É permitido, mas fortemente desencorajado por uma questão de estilo, especificar de forma redundante o modificador público dos methods de interface.

Não é necessário declarar o resumo da interface.

Assim como declarar todos esses methods public (que eles já são se a interface é pública) ou abstract (que eles já estão em uma interface) é redundante.

Ninguém está parando você, no entanto.

Outras coisas que você pode declarar explicitamente, mas não precisam:

  • chame super () na primeira linha de um construtor
  • extends Object
  • implementar interfaces herdadas

Existem outras regras que se aplicam a uma interface abstrata?

Uma interface já é “abstrata”. Aplicar essa palavra-chave novamente não faz diferença alguma.

Esteja ciente de que na spring não tem significado acadêmico. A interface abstrata é um aviso para o desenvolvedor não usá-lo para @Autowired . Espero que a primavera / eclipse @Autowired veja esse atributo e avise / falhe sobre os usos de tal atributo.

Um exemplo real: o proxy @Service em @Transnational para um @Repository precisa usar os mesmos methods básicos, mas deve usar interfaces diferentes que @Autowired essa interface abstrata devido a @Autowired . (Eu chamo isso de interface XXXSpec)

Toda interface é implicitamente abstrata.
Este modificador é obsoleto e não deve ser usado em novos programas.

[A Especificação da Linguagem Java – 9.1.1.1 Interfaces abstract ]

Observe também que os methods do membro da interface são implicitamente public abstract .
[A especificação da linguagem Java – 9.2 membros da interface]

Por que esses modificadores estão implícitos? Não há outro modificador (nem mesmo o modificadorno modifier ‘) que seria útil aqui, então você não precisa explicitamente digitá-lo.

Não é necessário. É uma peculiaridade da linguagem.

Não é necessário, pois as interfaces são abstratas por padrão, já que todos os methods em uma interface são abstratos.

Uma interface abstrata não é tão redundante como todos parecem estar dizendo, pelo menos em teoria.

Uma interface pode ser estendida, assim como uma class pode. Se você projetar uma hierarquia de interface para seu aplicativo, você pode muito bem ter uma interface ‘Base’, você estende outras Interfaces de, mas não quer, como um Objeto em si.

Exemplo:

 public abstract interface MyBaseInterface { public String getName(); } public interface MyBoat extends MyBaseInterface { public String getMastSize(); } public interface MyDog extends MyBaseInterface { public long tinsOfFoodPerDay(); } 

Você não quer que uma class implemente o MyBaseInterface, apenas os outros dois, MMyDog e MyBoat, mas ambas as interfaces compartilham a interface MyBaseInterface, portanto, tenha uma propriedade ‘name’.

Eu sei que é meio acadêmico, mas achei que alguns poderiam achar interessante. 🙂

É realmente apenas um ‘marcador’ neste caso, para sinalizar aos implementadores da interface que não foi projetado para ser implementado por conta própria. Eu deveria apontar um compilador (Pelo menos o sol / ora 1.6 com o qual eu tentei) compila uma class que implementa uma interface abstrata.

Bem ‘Abstract Interface’ é uma construção lexical: http://en.wikipedia.org/wiki/Lexical_analysis .

É exigido pelo compilador, você também pode escrever interface .

Bem, não se aprofunde muito na construção léxica da linguagem, pois eles a colocaram lá para resolver alguma ambiguidade de compilation, que é denominada como casos especiais durante o processo de compilation ou para alguma compatibilidade com versões anteriores, tente se concentrar na construção Lexical do núcleo.

A essência da interface é capturar algum conceito abstrato (ideia / pensamento / ordem superior de pensamento etc) cuja implementação pode variar … ou seja, pode haver implementação múltipla.

Uma interface é um tipo de dados abstrato puro que representa os resources do object que está capturando ou representando.

Os resources podem ser representados pelo espaço ou pelo tempo. Quando eles são representados por espaço (armazenamento de memory) significa que sua class concreta implementará um campo e método / methods que operarão naquele campo ou por tempo, o que significa que a tarefa de implementar o recurso é puramente computacional (requer mais relógios cpu para processamento) para que você tenha uma troca entre espaço e tempo para a implementação do recurso.

Se sua class concreta não implementa todos os resources, ela se torna novamente abstrata porque você tem uma implementação de seu pensamento ou idéia ou abstração, mas ela não está completa, você a especifica por class abstract .

Uma class concreta será uma class / conjunto de classs que capturará totalmente a abstração que você está tentando capturar a class XYZ.

Então o padrão é

 Interface--->Abstract class/Abstract classs(depends)-->Concrete class