Les méthodes statiques dans les interfaces sont apparues à partir de Java 8. Elles sont déclarées avec le mot clé static et sont mises en œuvre directement dans l'interface. Les méthodes statiques ne sont pas héritées par les classes qui les implémentent, mais sont appelées par le nom de l'interface.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Question : Une méthode statique d'interface peut-elle être appelée via un objet de la classe implémentante ?
Réponse : Non, une méthode statique d'interface est toujours appelée par le nom de l'interface, et non par une instance ou le nom de la classe d'implémentation. L'exemple suivant provoquera une erreur de compilation :
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Erreur ! Il faut MathUtils.sum(1, 2)
Histoire
Les développeurs ont tenté par erreur de "redéfinir" une méthode statique d'interface dans une classe implémentante et s'attendaient à appeler cette méthode via une instance. Au final, la version de l'interface était toujours appelée, ce qui menait à une logique métier incorrecte lors de son utilisation.
Histoire
Lors de la migration de méthodes utilitaires d'une classe vers une interface, une partie du code utilisait un appel via un objet :
obj.method(), ce qui est devenu impossible, nécessitant un refactoring des appels enInterfaceName.method()à travers tout le projet.
Histoire
Le support des anciennes versions de Java a conduit à des erreurs de compilation après l'ajout de méthodes statiques dans les interfaces, les développeurs n'ayant pas vérifié quelle version du compilateur était utilisée dans CI, le build a commencé à échouer régulièrement.