Maintenant que toutes les déclarations de méthodes dans une interface Java ne sont pas publiques, les méthodes doivent-elles être déclarées avec ces modificateurs?

14

Depuis Java 8, des defaultméthodes ont été introduites dans les interfaces. En fait, cela signifie que toutes les méthodes d'un interfacefichier ne le sont pas abstract.

À partir de Java 9 (peut-être), les privateméthodes seront autorisées. Cela signifie que toutes les méthodes d'un interfacefichier ne le sont pas public abstract.

La question "Les méthodes d'une interface Java doivent-elles être déclarées avec ou sans le publicmodificateur d'accès?" a été demandé à Stack Overflow sur /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m

Là, la plupart des réponses ont fait valoir qu'il public abstractne fallait pas les utiliser car aucune méthode dans un interfacene pouvait être autre chose que public abstract. Ce n'est plus le cas.

Donc, à la lumière de ces nouvelles fonctionnalités des interfaces, les public abstractmots clés doivent -ils être utilisés dans une déclaration de méthode d'interface Java?

Dans mon environnement spécifique, nous aurons des personnes qui sont des ingénieurs logiciels expérimentés, mais pas expérimentés en Java, lisant de temps en temps le code Java. Je pense que le fait de laisser de côté les public abstractmots - clés créera maintenant un point de confusion supplémentaire pour ceux qui ne connaissent pas l'histoire de la façon dont les interfaces en sont venues à avoir des règles différentes pour utiliser ces mots-clés.

David Campbell
la source
5
avez-vous vérifié Java 8 JLS? La même section que dans l'ancienne réponse acceptée à SO suggère que l'introduction de méthodes par défaut n'a pas changé la recommandation précédente qui était basée sur les mêmes considérations de redondance: "Une méthode d'interface sans defaultmodificateur ou staticmodificateur est implicitement abstract... Elle est autorisée, mais déconseillé pour des raisons de style, de spécifier de manière redondante le abstractmodificateur d'une telle déclaration de méthode. " Pourquoi pensez-vous que les choses devraient changer?
moucher
3
Je pensais que les choses pourraient changer parce que la condition pour qu'une méthode soit implicitement abstractde plus en plus compliquée. Dans Java 9, cette même phrase pourrait être: "Une méthode d'interface sans defaultmodificateur ou staticmodificateur ou privatemodificateur est implicitement abstraite ..." En outre, les arguments auxiliaires pour ne pas utiliser explicitement les mots-clés, à savoir que toutes les méthodes d'interface sont public abstract, sont maintenant sans objet.
David Campbell
TBH Je ne comprends pas le raisonnement derrière les méthodes "par défaut", et même les méthodes statiques dépassent le cadre de ce que les interfaces sont normalement destinées à faire. Les interfaces ne sont pas censées être remplies de concrétion. C'est pourquoi ce sont des types utiles pour les références.
Trixie Wolf
1
Les méthodes par défaut de @TrixieWolf permettent aux interfaces d'évoluer. Auparavant, et contrairement aux classes, l'ajout d'une méthode interrompait chaque implémentation; maintenant, vous pouvez développer une interface tant que vous avez un bon candidat par défaut. Envisagez d'ajouter streamà java.util.Collectionou Map.getOrDefault(). L'alternative est de créer une nouvelle sous-interface, et d'amener tout le monde à abattre, comme Graphics2D, et personne n'a apprécié cela!
SusanW

Réponses:

2

Pour développer la réponse StackOverflow:

  1. Le publicmodificateur d'accès n'est pas nécessaire car

    Chaque déclaration de méthode dans le corps d'une interface est implicitement publique (§6.6). Il est autorisé, mais déconseillé pour des raisons de style, de spécifier de manière redondante le modificateur public pour une déclaration de méthode dans une interface. ( Section 9.4 )

  2. Le abstractmodificateur d'accès n'est pas nécessaire car

    Une méthode par défaut est une méthode qui est déclarée dans une interface avec le modificateur par défaut; son corps est toujours représenté par un bloc .

    Et...

    Une méthode d'interface dépourvue d'un modificateur par défaut ou d'un modificateur statique est implicitement abstraite , donc son corps est représenté par un point-virgule , pas un bloc.

Étant donné que les méthodes par défaut ont un corps, et celles qui ne sont pas intrinsèquement abstraites, et que chaque déclaration de méthode sur une interface est intrinsèquement publique, vous n'avez pas besoin de spécifier l'un ou l'autre des mots clés.


L'un des commentaires sur une réponse disait:

Ne les faites pas réfléchir! J'ai toujours ajouté un résumé public avant, malgré le style policier, car cela clarifiait les choses et rappelait le lecteur. Maintenant, je suis justifié parce que Java 8 et 9 compliquent les choses (user949300)

Un commentaire sur la question StackOverflow (voté 18 fois) réfute ceci:

C'est mauvais car l'écrire en public implique qu'il peut être non public (Pacerier)

Les implications du code, en particulier des interfaces, sont importantes.

Greg Burghardt
la source
Le commentaire que vous avez cité de StackOverflow est désormais obsolète. Dire que l'ajout du modificateur public est une mauvaise écriture car cela implique qu'il peut être non public est contradictoire. La méthode peut être non publique.
David Campbell
@DavidCampbell: Eh bien, je pense que cette question pourrait être mieux posée après la sortie de Java 9. :) La spécification Java en cours de finalisation pourrait répondre à cette question.
Greg Burghardt
1

L'absence d'une implication de déclaration de bloc n'est-elle pas suffisante? Souhaitez-vous déclarer, extends Objectbien que ce soit implicite?

Si le développeur ne comprend pas la redondance, il est possible qu'il ne comprenne pas pleinement le concept derrière la fonctionnalité de langage , ce qui est un problème encore plus important que d'être confus au sujet des modificateurs.

Le développeur doit comprendre que le but d'une interface est de créer un contrat qui définit comment un client peut interagir avec un objet. Cela suggère que toute méthode dans une interface utilisée pour l'interaction d'objet doit être exposée aux clients.

Si vous déclarez une méthode privée, vous déclarez explicitement que cette méthode n'est pas destinée à être appelée par les clients, ce qui, dans le cas des interfaces, ne peut pas être facilement déduit.

Vince Emigh
la source
2
Ne les faites pas réfléchir! J'ai toujours ajouté public abstractavant, malgré le style policier, car cela clarifiait les choses et rappelait le lecteur. Maintenant, je suis justifié parce que Java 8 et 9 compliquent les choses :-). Java est déjà largement redondant.
user949300
1
@ user949300 Souhaitez-vous également ajouter extends Objectà chaque classe qui dérive directement Object? Ce sont des informations qu'un développeur devrait déjà connaître, c'est pourquoi elles sont inférées. Moins il y a d'informations inutiles à l'écran, plus il est facile de traiter les informations importantes. J'espère que je vous ai persuadé de venir du côté obscur (Comprenez-vous? Parce que les choses implicites ne peuvent pas être vues). Sinon, ça valait le coup haha. En fin de compte, cela revient à ce qui rend le code plus facile à gérer pour le développeur
Vince Emigh
@ user949300 En faisant cela, vous êtes plus susceptible de créer de la confusion sur ce que cela signifie lorsque les méthodes d'interface ne contiennent pas ces déclarations. c'est-à-dire que si des développeurs apprennent java en regardant votre code, vous avez potentiellement entravé leur compréhension de la syntaxe des déclarations d'interface.
JimmyJames
Vince, non, je ne voudrais pas étendre Object, bien que je ne lance pas un ajustement quand je vois du code qui le fait. @JimmyJames, si l'on ajoute régulièrement un résumé public aux éléments qui le sont, je ne vois aucune confusion. Suis-je en train de manquer quelque chose? OTOH, je vois votre point sur l'encombrement. Par exemple, je n'ajoute pas d' finalarguments de méthode avant, sauf si quelque chose de drôle l'exige (comme une classe interne anonyme etc ...)
user949300
@ user949300 Il veut dire que si un utilisateur était déjà exposé au manque de modificateurs et la raison derrière cela, ils peuvent se demander pourquoi les modificateurs sont là quand ils les voient, ce qui leur fait supposer qu'il peut y avoir une raison réelle autre que d'être explicite . Je ne lancerais pas une crise si je voyais extends Object, mais cela lèverait certainement un drapeau et me ferait me demander pourquoi. Comme je l'ai mentionné dans le post, faire de telles choses pourrait impliquer que le développeur puisse avoir une mauvaise compréhension du fonctionnement de quelque chose (peut ne pas savoir que tous les objets s'étendent déjà Object, d'où l'extension explicite)
Vince Emigh