ProgrammationArchitecte Java

Qu'est-ce que les méthodes statiques dans les interfaces Java et en quoi diffèrent-elles des méthodes abstraites ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.

  • Déclaration d'une méthode statique :
interface MathUtils { static int sum(int a, int b) { return a + b; } }
  • Appel : MathUtils.sum(1, 2);
  • On ne peut pas redéfinir les méthodes statiques des interfaces dans les classes implémentantes.
  • Elles fournissent des fonctions "utilitaires" liées à l'interface, mais ne nécessitent pas d'état d'instance.
  • Les méthodes abstraites doivent être mises en œuvre par une classe ; les statiques ne le doivent pas.

Question piège

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)

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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 en InterfaceName.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.