Depuis Java 8, des default
méthodes ont été introduites dans les interfaces. En fait, cela signifie que toutes les méthodes d'un interface
fichier ne le sont pas abstract
.
À partir de Java 9 (peut-être), les private
méthodes seront autorisées. Cela signifie que toutes les méthodes d'un interface
fichier 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 public
modificateur 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 abstract
ne fallait pas les utiliser car aucune méthode dans un interface
ne 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 abstract
mots 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 abstract
mots - 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.
la source
default
modificateur oustatic
modificateur est implicitementabstract
... Elle est autorisée, mais déconseillé pour des raisons de style, de spécifier de manière redondante leabstract
modificateur d'une telle déclaration de méthode. " Pourquoi pensez-vous que les choses devraient changer?abstract
de plus en plus compliquée. Dans Java 9, cette même phrase pourrait être: "Une méthode d'interface sansdefault
modificateur oustatic
modificateur ouprivate
modificateur 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 sontpublic abstract
, sont maintenant sans objet.stream
àjava.util.Collection
ouMap.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!Réponses:
Pour développer la réponse StackOverflow:
Le
public
modificateur d'accès n'est pas nécessaire carLe
abstract
modificateur d'accès n'est pas nécessaire carEt...
É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:
Un commentaire sur la question StackOverflow (voté 18 fois) réfute ceci:
Les implications du code, en particulier des interfaces, sont importantes.
la source
L'absence d'une implication de déclaration de bloc n'est-elle pas suffisante? Souhaitez-vous déclarer,
extends Object
bien 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.
la source
public abstract
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 :-). Java est déjà largement redondant.extends Object
à chaque classe qui dérive directementObject
? 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éveloppeurfinal
arguments de méthode avant, sauf si quelque chose de drôle l'exige (comme une classe interne anonyme etc ...)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)