194 votes

Interface abstraite Java

Considérons un exemple (qui se compile en Java)

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

Pourquoi est-il nécessaire qu'une interface soit "déclarée" abstraite? Y a-t-il d'autres règles qui s'appliquent avec une interface abstraite?


Enfin: Si abstract est obsolète, pourquoi est-il inclus dans Java? Y a-t-il une histoire pour l'interface abstraite?

440voto

aioobe Points 158466

Pourquoi est-il nécessaire pour une interface à être "déclaré" abstrait?

Il n'est pas.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

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

Les Interfaces et leurs méthodes sont implicitement abstract et en ajoutant que le modificateur ne fait aucune différence.

Est-il d'autres règles qui s'applique avec une interface abstraite?

Non, les mêmes règles s'appliquent. La méthode doit être implémentée par un (béton) la mise en œuvre de la classe.

Si abstraite est obsolète, pourquoi est-il inclus dans Java? Est-il une histoire pour l'interface abstraite?

Question intéressante. J'ai creusé la première édition de JLS, et même là, il dit "Ce modificateur est obsolète et ne doit pas être utilisé dans les nouveaux programmes Java".

Ok, creusant encore plus loin... Après avoir heurté de nombreux liens cassés, j'ai réussi à trouver une copie de l'original de Chêne 0.2 Spécification (ou "manuel"). Très intéressant à lire, je dois dire, et seulement 38 pages au total! :-)

En vertu de l'Article 5, les Interfaces, il donne l'exemple suivant:

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

Et dans la marge qu'il dit

Dans l'avenir, le "=0" dans le cadre de la déclaration de méthodes dans les interfaces peuvent aller loin.

En supposant =0 ai remplacé par de la abstract mot-clé, je soupçonne qu' abstract a été à un certain point obligatoire pour les méthodes d'interface!

37voto

Lukas Eder Points 48046

Il n'est pas nécessaire, c'est facultatif, tout comme public sur les méthodes d'interface.

Voir la JLS sur ceci:

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

9.1.1.1 des Interfaces abstraites Chaque interface est implicitement abstrait. Cette option est obsolète et ne doit pas être utilisé dans les nouveaux programmes.

Et

9.4 Résumé Des Déclarations De Méthode De

[...]

Pour la compatibilité avec les anciennes versions de la plate-forme Java, il est permis, mais déconseillé, comme une question de style, de manière redondante spécifiez le résumé modificateur pour les méthodes déclarées dans les interfaces.

Il est permis, mais fortement déconseillé comme une question de style, de de manière redondante spécifier le public modificateur pour les méthodes d'interface.

11voto

Thilo Points 108673

Il n'est pas nécessaire de déclarer l'interface abstraite.

Seulement, comme la déclaration de toutes ces méthodes publiques (dont ils sont déjà si l'interface est public) ou abstraite (ils le sont déjà dans une interface) est redondant.

Personne ne vous en empêche, cependant.

D'autres choses que vous pouvez le mentionner explicitement, mais n'en ont pas besoin:

  • appel à super() sur la première ligne d'un constructeur
  • extends Object
  • mettre en œuvre des interfaces héritées

Est-il d'autres règles qui s'applique avec une interface abstraite?

Une interface est déjà "abstrait". L'application de ce nouveau mot-clé ne fait absolument aucune différence.

7voto

Adi Lev Points 11

Être conscient que, dans le Printemps, il a non universitaire de sens. L'interface abstraite est un avertissement pour le développeur de ne pas l'utiliser pour @Autowired. J'espère que le printemps/eclipse @Autowired va regarder cet attribut et d'avertissement/d'échouer sur les usages de ces.

Un exemple réel: @proxy de Service en vertu de l' @Transnationaux pour un @Référentiel besoin d'utiliser les mêmes méthodes de base cependant, ils doivent utiliser différentes interfaces qui étend cette interface abstraite en raison d' @Autowired. (J'appelle cela XXXSpec interface)

3voto

kapep Points 8925

Chaque interface est implicitement abstrait.
Cette option est obsolète et ne doit pas être utilisé dans les nouveaux programmes.

[Le Langage Java Specification - 9.1.1.1 abstract Interfaces]

Notez aussi que l'interface de méthodes membres sont implicitement public abstract.
[Le Langage Java Specification - 9.2 Les Membres Interface]

Pourquoi les modificateurs implicite? Il n'y a aucun autre modificateur (même pas le"pas de modificateur'-modificateur) qui serait utile, ici, de sorte que vous n'avez pas explicitement d'avoir à le saisir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X