ProgrammationDéveloppeur Java

Qu'est-ce que les interfaces avec des méthodes par défaut (default methods) en Java, et quels sont les nuances de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Java 8, le concept de default methods a été introduit - ce sont des méthodes avec une implémentation, déclarées à l'intérieur de l'interface. Elles permettent d'ajouter de nouvelles méthodes aux interfaces sans compromettre la compatibilité avec les implémentations existantes.

Syntaxe :

public interface MyInterface { default void printHello() { System.out.println("Hello!"); } }

Caractéristiques et subtilités :

  • Si une classe implémente deux interfaces avec la même signature de méthode par défaut, un conflit se produit et la classe doit redéfinir cette méthode.
  • Les méthodes par défaut ne peuvent pas redéfinir les méthodes de la classe Object (par exemple, equals, hashCode).
  • Il est également possible de déclarer des méthodes statiques dans les interfaces.

Question piquante.

Que se passe-t-il si une classe implémente deux interfaces avec la même méthode par défaut et ne redéfinit pas cette méthode ?

Réponse : Le compilateur produira une erreur "class... inherits unrelated defaults for ... from types ... and ...", et il sera nécessaire de mettre en œuvre explicitement cette méthode dans la classe.

Exemple :

interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // Erreur de compilation !

Solution :

class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // ou B.super.doSomething() } }

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet.


Histoire

Dans un projet d'équipe pour la migration de l'API, un méthode par défaut a été ajoutée à l'interface commune. Les anciennes implémentations de l'interface n'ont pas redéfini la nouvelle méthode, ce qui a conduit à un comportement inattendu, puisque l'implémentation par défaut a été exécutée au lieu de la logique attendue. En conséquence, les utilisateurs ont remarqué une dégradation des fonctionnalités.


Histoire

Lors de l'extension d'une bibliothèque, l'un des développeurs a ajouté une méthode par défaut avec une logique métier dans une interface commune. L'ajout ultérieur d'une méthode identique avec un comportement différent dans une autre interface a entraîné un conflit d'héritage, ce qui a empêché la compilation des nouvelles implémentations.


Histoire

Un développeur a tenté d'utiliser une méthode par défaut nommée hashCode dans l'interface, s'attendant à ce que cela affecte la redéfinition de la méthode dans les classes dérivées, mais le compilateur a refusé cela. Cela a conduit à une longue enquête sur les raisons de l'erreur et à une refonte de la structure des interfaces.