Interface abstrata Java

197

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 abstractestá obsoleto, por que está incluído no Java? Existe um histórico para a interface abstrata?

Buhake Sindi
fonte
5
Não é uma duplicata, considerando a parte " Finalmente: .... ".
aioobe
Esta questão relacionada cita um exemplo real: stackoverflow.com/questions/4380796/…
Raedwald
1
E por que o Eclipse adiciona 'abstract' por padrão quando você 'extrai a interface'?
ModdyFire 27/02/2014
@ModdyFire, por favor elabore?
Buhake Sindi 27/02

Respostas:

447

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.
}

As interfaces e seus métodos são implicitamente abstracte adicionar esse 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 classe de implementação (concreta).

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

Pergunta interessante. Desenterrei a primeira edição do JLS e, mesmo lá, ele diz "Este modificador é obsoleto e não deve ser usado em novos programas Java" .

Ok, cavando ainda mais ... Depois de acessar vários links quebrados, consegui encontrar uma cópia da Especificação Oak 0.2 original (ou "manual"). Leitura bastante interessante, 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" dos métodos de declaração nas interfaces poderá desaparecer.

Supondo que =0foi substituído pela abstractpalavra - chave, suspeito que abstractem algum momento era obrigatório para os métodos de interface!


Artigo relacionado: Java: interfaces abstratas e métodos de interface abstrata

aioobe
fonte
3
mas o próprio resumo não é obsoleto, ou? É obsoleto para interfaces, mas ainda existem classes e métodos abstratos.
user85421
Obrigado ;-) Eu acho que finalmente identifiquei a origem por permitir mesmo abstractna frente dos métodos de interface.
aioobe
13
Uau. Portanto, é obsoleto "por design". Esses JLS os designers realmente eram sempre tanto medo de quebrar alguma coisa, mesmo quebrando coisas que nunca foi lançado ... :-)
Lukas Eder
@aioobe, você deve ser o rastreador do Google web que não sabemos sobre ... lol
Buhake Sindi
18
Btw. "public" também não é necessário nos métodos em uma declaração de interface ... eles são sempre públicos.
rec
37

Não é necessário, é opcional, assim como publicnos métodos 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 de métodos abstratos

[...]

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

É permitido, mas fortemente desencorajado por uma questão de estilo, especificar de forma redundante o modificador público para métodos de interface.

Lukas Eder
fonte
7
a JLS: É permitido, mas fortemente desencorajado, como uma questão de estilo, para escrever de forma redundante duas frases com o mesmo significado e expressão quase exata ao lado do outro ...
n611x007
11

Não é necessário declarar a interface abstrata.

Assim como declarar todos esses métodos públicos (que já são, se a interface for pública) ou abstratos (que já estão em uma interface) são redundantes.

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

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

  • 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". A aplicação dessa palavra-chave novamente não faz absolutamente nenhuma diferença.

Thilo
fonte
2
Aparentemente, os métodos são públicos mesmo se a própria interface for privada de pacote.
Thilo
7

Esteja ciente de que na primavera tem um significado não acadêmico. A interface abstrata é um aviso para o desenvolvedor não usá-la @Autowired. Espero que a primavera / eclipse @Autowiredanalise esse atributo e avise / falhe sobre o uso de tais atributos.

Um exemplo real: o proxy @Service em @Transnational para um @Repository precisa usar os mesmos métodos básicos, no entanto, eles devem usar interfaces diferentes que estendem essa interface abstrata devido a @Autowired. (Eu chamo essa interface de XXXSpec)

Adi Lev
fonte
Com um bom resultado, observei amplamente a separação de injeções de passaporte não passiváveis. Talvez eu possa usar findbugs / checkstyle para uma regra ....
Grim
3

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 abstractinterfaces]

Observe também que os métodos dos membros 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 modificador ' no modifier ') que seria útil aqui, portanto você não precisa digitá-lo explicitamente.

kapex
fonte
2

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

Boêmio
fonte
2

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

Swagatika
fonte
-2

Uma interface abstrata não é tão redundante quanto todo mundo parece dizer, pelo menos em teoria.

Uma interface pode ser estendida, assim como uma classe. Se você projetar uma hierarquia de interfaces para o seu aplicativo, poderá ter uma interface 'base', ampliando outras interfaces, 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 deseja que uma classe 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 foram projetados para serem implementados por conta própria. Devo apontar que um compilador (pelo menos o sun / ora 1.6 com o qual tentei) compila uma classe que implementa uma interface abstrata.

Eurospoofer
fonte
3
Eu acredito que você absolutamente não entendeu minha pergunta.
Buhake Sindi
3
Não concordo com esse raciocínio. Eu acho que toda interface deve fornecer um conjunto de funcionalidades totalmente utilizável e, portanto, toda interface pode ser implementada por conta própria. Também não haveria razão para um compilador se recusar a compilar uma classe implementando uma interface declarada explicitamente como abstrata, porque todas as interfaces já são implicitamente abstratas. Isso mudaria completamente o significado da palavra-chave "abstrata".
BladeCoder
-3

O poço '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 preocupe muito com a construção lexical da linguagem, pois eles podem tê-la colocado para resolver alguma ambiguidade de compilação que é denominada casos especiais durante o processo de compilação ou, para alguma compatibilidade com versões anteriores, tente se concentrar na construção lexical principal.

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

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

Os recursos podem ser representados pelo espaço ou pelo tempo. Quando eles são representados pelo espaço (armazenamento em memória), significa que sua classe concreta implementará um campo e método / métodos que operarão nesse campo ou no tempo, o que significa que a tarefa de implementar o recurso é puramente computacional (requer mais relógios da CPU para processamento), para que você tenha uma troca entre espaço e tempo para a implementação do recurso.

Se sua classe concreta não implementar todos os recursos, ela se tornará novamente abstrata porque você implementou seu pensamento, ideia ou abstração, mas não está completa, especifique-a por abstractclasse.

Uma classe concreta será uma classe / conjunto de classes que capturará completamente a abstração que você está tentando capturar na classe XYZ.

Então o padrão é

Interface--->Abstract class/Abstract classes(depends)-->Concrete class
Manish
fonte
1
Esta resposta não responde à minha pergunta. Também "It seams like you are new to Java. Realmente?
Buhake Sindi
"resumo é obsoleto"
Manish 29/11
(1) "abstract is obsolete" -> se o removerem e o compilador parar de reconhecê-lo, a versão anterior do código-fonte usando a "interface abstract" não será compilada na versão mais recente. Eles precisam manter a compatibilidade com versões anteriores. Quando você define interface abstrata, o significado da palavra-chave interface fica preso a ela "abstract", que é uma versão muito mais limpa, no entanto, para programadores experientes como você, eles forneceram o atalho "interface". Sua pergunta é semelhante a i = i + 1 == > i ++ .. a escolha é sua, o que você escolhe: D
Manish
Veja a resposta aceita. Eu sei que abstracté obsoleto na interface. Eu queria saber por que ainda é aceitável e qual é a história por trás da abstractinterface. Você está me dando um guia Java 101 sobre interface abstrata vs.
Buhake Sindi
Não é uma construção lexical. É sintaxe. Semanticamente, é redundante. Não é 'exigido pelo compilador'. A parte sobre o espaço / tempo é apenas uma bobagem. Nada disso absurdo responde à pergunta que foi feita. Não use formatação de código para texto que não seja código.
Marquês de Lorne