Dans Java 8 et versions ultérieures, la réponse à cette question est toujours valable mais est désormais plus nuancée.
Premièrement, ces déclarations de la réponse acceptée restent correctes:
- les interfaces sont destinées à spécifier leurs comportements implicites dans un contrat (un énoncé de règles de comportement auxquelles les classes implémentantes doivent obéir pour être considérées comme valides)
- il y a une distinction entre le contrat (règles) et la mise en œuvre (codage programmatique des règles)
- les méthodes spécifiées dans l'interface DOIVENT TOUJOURS être implémentées (à un moment donné)
Alors, quelle est la nuance qui est nouvelle dans Java 8? En parlant de "méthodes facultatives" une des suivantes est maintenant appropriée:
1. Une méthode dont la mise en œuvre est contractuellement facultative
La "troisième déclaration" dit que les méthodes d'interface abstraites doivent toujours être implémentées et cela reste vrai dans Java 8+. Cependant, comme dans Java Collections Framework, il est possible de décrire certaines méthodes d'interface abstraites comme "facultatives" dans le contrat.
Dans ce cas, l'auteur qui implémente l'interface peut choisir de ne pas implémenter la méthode. Le compilateur insistera sur une implémentation, cependant, et donc l'auteur utilise ce code pour toutes les méthodes facultatives qui ne sont pas nécessaires dans la classe d'implémentation particulière:
public SomeReturnType optionalInterfaceMethodA(...) {
throw new UnsupportedOperationException();
}
Dans Java 7 et les versions antérieures, c'était vraiment le seul type de «méthode optionnelle» qui existait, c'est-à-dire une méthode qui, si elle n'était pas implémentée, lançait une exception UnsupportedOperationException. Ce comportement est nécessairement spécifié par le contrat d'interface (par exemple, les méthodes d'interface optionnelles de Java Collections Framework).
2. Une méthode par défaut dont la réimplémentation est facultative
Java 8 a introduit le concept de méthodes par défaut . Ce sont des méthodes dont l'implémentation peut être et est fournie par la définition d'interface elle-même. Il n'est généralement possible de fournir des méthodes par défaut que lorsque le corps de la méthode peut être écrit en utilisant d'autres méthodes d'interface (c'est-à-dire les "primitives"), et quandthis
peut signifier «cet objet dont la classe a implémenté cette interface».
Une méthode par défaut doit respecter le contrat de l'interface (comme toute autre implémentation de méthode d'interface doit l'être). Par conséquent, la spécification d'une implémentation de la méthode d'interface dans une classe d'implémentation est à la discrétion de l'auteur (tant que le comportement est adapté à son objectif).
Dans ce nouvel environnement, le Java Collections Framework pourrait être réécrit comme suit:
public interface List<E> {
:
:
default public boolean add(E element) {
throw new UnsupportedOperationException();
}
:
:
}
De cette façon, la méthode "facultative" add()
a le comportement par défaut de lancer une exception UnsupportedOperationException si la classe d'implémentation ne fournit pas de nouveau comportement propre, ce qui est exactement ce que vous souhaiteriez voir se produire et qui est conforme au contrat pour List. Si un auteur écrit une classe qui ne permet pas d'ajouter de nouveaux éléments à une implémentation de List, l'implémentation deadd()
est facultative car le comportement par défaut est exactement ce qui est nécessaire.
Dans ce cas, la "troisième instruction" ci-dessus est toujours vraie, car la méthode a été implémentée dans l'interface elle-même.
3. Une méthode qui renvoie un Optional
résultat
Le nouveau type final de méthode optionnelle est simplement une méthode qui renvoie un Optional
. La Optional
classe offre une manière nettement plus orientée objet de traiter les null
résultats.
Dans un style de programmation courant, tel que celui couramment observé lors du codage avec la nouvelle API Java Streams, un résultat nul à tout moment provoque le blocage du programme avec une exception NullPointerException. La Optional
classe fournit un mécanisme pour renvoyer des résultats nuls au code client d'une manière qui active le style fluide sans provoquer le blocage du code client.