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?
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
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.
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:
extends Object
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.
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)
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 .
Ce n'est pas nécessaire, car les interfaces sont par défaut abstraites car toutes les méthodes d'une interface sont abstraites.
Ce n'est pas nécessaire. C'est une bizarrerie de la langue.