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 :
Object (par exemple, equals, hashCode).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() } }
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
hashCodedans 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.