web-dev-qa-db-fra.com

Java interface abstraite

Prenons un exemple (qui 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? Existe-t-il un historique pour l'interface abstraite?

192
Buhake Sindi

Pourquoi est-il nécessaire qu'une interface soit "déclarée" abstraite?

Ce 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 l'ajout de ce modificateur ne fait aucune différence.

Y a-t-il d'autres règles qui s'appliquent avec une interface abstraite?

Non, les mêmes règles s'appliquent. La méthode doit être implémentée par n'importe quelle classe d'implémentation (concrète).

Si abstract est obsolète, pourquoi est-il inclus en Java? Existe-t-il un historique pour l'interface abstraite?

Question interessante. J'ai déterré la première édition de JLS, et même là, il est écrit "Ce modificateur est obsolète et ne doit pas être utilisé dans les nouvelles Java programmes " .

Ok, creuser encore plus loin ... Après avoir cliqué sur de nombreux liens brisés, j'ai réussi à trouver une copie de l'original Oak 0.2Spécification (ou "manuel"). Très intéressante lecture je dois dire, et seulement 38 pages au total! :-)

Sous la section 5, Interfaces, vous trouverez l'exemple suivant:

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

Et dans la marge, il est écrit

Dans le futur, la partie "= 0" de la déclaration de méthodes dans les interfaces peut disparaître.

En supposant que =0 soit remplacé par le mot clé abstract, je suppose que abstract était à un moment donné obligatoire pour les méthodes d'interface!


Article connexe: Java: interfaces abstraites et méthodes d'interface abstraites

439
aioobe

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

Voir le JLS sur ceci:

http://Java.Sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 Interfaces abstraites Chaque interface est implicitement abstraite. Ce modificateur est obsolète et ne doit pas être utilisé dans les nouveaux programmes.

Et

9.4 Déclarations de méthodes abstraites

[...]

Pour assurer la compatibilité avec les anciennes versions de la plate-forme Java, il est autorisé, mais déconseillé, en termes de style, de spécifier de manière redondante le modificateur abstrait pour les méthodes déclarées dans les interfaces.

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

36
Lukas Eder

Il n'est pas nécessaire de déclarer le résumé d'interface.

Tout comme déclarer toutes ces méthodes publiques (ce qu'elles sont déjà si l'interface est publique) ou abstraites (qu'elles sont déjà dans une interface) est redondant.

Personne ne t'arrête, cependant.

Autres choses que vous pouvez déclarer explicitement, mais que vous n'avez pas besoin de:

  • appeler super () sur la première ligne d'un constructeur
  • extends Object
  • implémenter des interfaces héritées

Y a-t-il d'autres règles qui s'appliquent avec une interface abstraite?

Une interface est déjà "abstraite". Appliquer à nouveau ce mot clé ne fait absolument aucune différence.

11
Thilo

Sachez qu'au printemps, cela n'a pas de sens académique. L'interface abstraite est un avertissement au développeur pour qu'il ne l'utilise pas pour @Autowired. J'espère que spring/Eclipse @Autowired examinera cet attribut et avertira/échouera à propos de son utilisation.

Un exemple concret: le proxy @Service sous @Transnational vers un @Repository doit utiliser les mêmes méthodes de base, mais il doit utiliser des interfaces différentes qui étendent cette interface abstraite en raison de @Autowired. (J'appelle cette interface XXXSpec)

7
Adi Lev

Chaque interface est implicitement abstraite.
Ce modificateur est obsolète et ne doit pas être utilisé dans les nouveaux programmes.

[La Java Spécification du langage - 9.1.1.1 abstract Interfaces]]

Notez également que les méthodes de membre d'interface sont implicitement public abstract.
[La Java Spécification du langage - 9.2 membres de l'interface]

Pourquoi ces modificateurs sont-ils implicites? Il n'y a pas d'autre modificateur (pas même le modificateur ' no modificateur ') qui serait utile ici, vous n'avez donc pas à le taper explicitement .

3
kapex

Ce n'est pas nécessaire, car les interfaces sont par défaut abstraites car toutes les méthodes d'une interface sont abstraites.

2
Swagatika

Ce n'est pas nécessaire. C'est une bizarrerie de la langue.

2
Bohemian