Pourquoi déclarer une méthode d'interface Java comme abstraite?

143

J'ai utilisé la fonction de refactoring "pull interface" d'Eclipse aujourd'hui pour créer une interface basée sur une classe existante. La boîte de dialogue proposait de créer toutes les nouvelles méthodes de la nouvelle interface sous forme de méthodes "abstraites".

Quel en serait l’avantage?

Je pensais que le fait que vous ayez été autorisé à déclarer les méthodes d'interface comme abstraites était une caractéristique superflue et inoffensive du langage qui n'est pas particulièrement encouragée.

Pourquoi Eclipse prendrait-il en charge un tel style, ou pourquoi quelqu'un choisirait-il volontairement de le faire?

Clarification: je ne demande pas pourquoi les méthodes d'interface sont abstraites, c'est évident. Je demande pourquoi on choisirait explicitement de les marquer comme abstraits puisque s'ils sont dans une interface, ils sont de toute façon abstraits.

Uri
la source

Réponses:

146

Selon la spécification du langage Java , le abstractmot - clé pour les interfaces est obsolète et ne doit plus être utilisé. (Section 9.1.1.1)

Cela dit, avec la propension de Java à la compatibilité ascendante, je doute vraiment que le abstractmot clé soit présent ou non.

jdmichal
la source
1
C'était ma compréhension (même si je ne connaissais pas la section JLS spécifique). Je me demande pourquoi Eclipse m'offrirait la possibilité de créer un marquage obsolète ...
Uri
Got moi. Quelqu'un quelque part a dû décider que c'était une "fonctionnalité" souhaitable et l'a mise. Vous savez, un de ces types
rusés
18
Bien que ce soit la réponse la mieux notée, elle fait référence à la mauvaise section de la spécification; 9.1.1.1 décrit le abstractmot - clé sur la déclaration de l'interface elle-même, pas sur ses membres. La réponse de @ Will ci-dessous est correcte et contient également des sources de liens valides.
Shaggy Frog
39

"L'avantage de cela" (ajouter un résumé sur la déclaration des méthodes d'interface) dans eclipse serait un vieux problème de compatibilité avec le compilateur jdt eclipse dans jdk1.3

Depuis la version 1.4, les bibliothèques jdk ne contiennent plus de méthodes abstraites par défaut (sur les classes abstraites implémentant des interfaces).
Cela trompe le diagnostic du compilateur Eclipse 1.3 car leur implémentation repose sur leur existence.
Notez que Javac 1.3 refuserait tout à fait de fonctionner contre les bibliothèques 1.4 (en utilisant l'option -bootclasspath).

Puisque le compilateur Eclipse est susceptible d'être au niveau de conformité 1.4 (voir Workbench>Preferences>Java>Compiler>JDK Compliance), ou d'utiliser au moins 1,3 bibliothèques de classes si vous utilisez le mode de conformité 1.3, la présence de "abstract" n'est pas requise dans la plupart des projets eclipse actuels.

VonC
la source
3
Bonne trouvaille. C'est donc la fonctionnalité de contourner un problème qui n'existe plus dans le compilateur Eclipse.
jdmichal
1
@jdmichal: exactement, et c'est aussi une réponse plus précise à la question d'Uri.
VonC
39

De Java SE 7 JLS (Java Language Specification): "Il est permis, mais déconseillé par souci de style, de spécifier de manière redondante le modificateur public et / ou abstrait pour une méthode déclarée dans une interface."

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

Volonté
la source
9

Selon JLS, les méthodes des interfaces sont abstraites par défaut, le mot-clé est donc redondant. Sachant cela, je ne l'utiliserais jamais pour "éviter le désordre de présentation".

Daniel Hiller
la source
Cela devrait être la bonne réponse. Voici un lien mis à jour - voir la section «note»
mork
Le JLS ne dit pas que le mot-clé est obsolète pour les méthodes dans les interfaces. Il dit: "Il est permis, mais déconseillé par souci de style, de spécifier de manière redondante le modificateur public et / ou abstrait pour une méthode déclarée dans une interface." JLS # 9.4 .
Marquis of Lorne le
@EJP Je n'ai pas dit que le JLS déclarait que le mot-clé serait obsolète, c'était mon opinion personnelle;) BTW ils notent que ce mot-clé est "redondant" ce qui n'est pas tout à fait le même que obsolète, en cela vous avez bien sûr raison . Maintenant que je sais, je vais modifier la réponse pour clarifier cela.
Daniel Hiller le