Mis à jour le 30/04/2018
  • 40 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Java 8 ou la révolution des interfaces

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous avons vu beaucoup de concepts jusqu'ici et je vous ai d'ailleurs dit que l'héritage multiple n'existait pas Java. Et bien Java 8 et son lot de nouveautés permet aux interfaces de définir des méthodes avec un comportement par défaut et de définir des méthodes statiques.

J'aurais très bien pu mettre ceci dans le chapitre précédent mais je le trouve bien assez complexe sans avoir à vous confronter avec ces genre de choses. Donc, en gros, dîtes-vous que ce chapitre n'est vrai qu'à partir de Java 8 et que si vous développez pour un environnement avec Java 7, n'utilisez pas ce que vous verrez ici !

Des méthodes statiques

Je vous avais dit qu'une interface est une classe 100% abstraite, ce n'est plus le cas depuis Java 8 car cette interface est valide et ce code fonctionne parfaitement :

public interface Reproduction {

	public static void description() {
		System.out.println("Méthode statique dans une interface");
	}
	
}


public class Main {

	public static void main(String[] args) {
		Reproduction.description();
	}
}

Nous pouvons même rajouter un niveau d'interface supplémentaire.

public interface Pondre extends Reproduction {
	public static void description() {
		Reproduction.description();
		System.out.println("Redéfinie dans Pondre.java");
	}	
}


public interface Mitose extends Reproduction {
	public static void description() {
		Reproduction.description();
		System.out.println("Redéfinie dans Mitose.java");
	}
}

Un nouveau code de test toujours fonctionnel :

public class Main {

	public static void main(String[] args) {
		Reproduction.description();
		Pondre.description();
		Mitose.description();		
	}
}

Qui nous donne :

Méthode statique dans une interface
Méthode statique dans une interface
Redéfinie dans Pondre.java
Méthode statique dans une interface
Redéfinie dans Mitose.java

Bon, ce n'est pas très compliqué. Mains si nous ajoutons une méthode abstraite dans notre interface mère et que nous ajoutons une classe qui implémente nous deux interfaces filles, que se passerait-il ? Et bien pas grand chose puisque nous devrons redéfinir la méthode en question dans notre classe.

Et des méthodes par défaut !

Mais depuis Java 8, il est possible d'ajouter un comportement par défaut à des méthodes dans une interface grâce au mot clé default. Regardez plutôt :

public interface Mitose extends Reproduction {
	public static void description() {
		Reproduction.description();
		System.out.println("Redéfinie dans Mitose.java");
	}
	
	default void reproduire() {
		System.out.println("Je me divise !");
	}
}

public interface Pondre extends Reproduction {

	public static void description() {
		Reproduction.description();
		System.out.println("Redéfinie dans Pondre.java");
	}

	
	default void reproduire() {
		System.out.println("Je ponds des oeufs !");
	}
	
}



public class Alien implements Pondre, Mitose {

	public void reproduire() {
		
		System.out.println("Je suis un alien et :");
		Pondre.super.reproduire();
		Mitose.super.reproduire();

	}
}

 
Ce qui nous donne ceci :

Je suis un alien et :
Je ponds des oeufs !
Je me divise

Il est à présent possible de bénéficier d'un comportement par défaut dans des méthodes d'interfaces. En plus de pouvoir jouer avec dans des objets, ceci permet notamment d'assurer une compatibilité à vos interfaces si vous souhaitez rajouter des méthodes dans celles-ci. En effet, dans un projet informatique de taille, vous aurez tout un tas d'interfaces et rajouter une méthode dans une interface voulais dire, avant Java 8 et les méthodes par défaut, repasser sur toutes les classes qui implémentent l'interface afin de redéfinir la nouvelle méthode : ce n'est plus la peine maintenant.

Comme preuve, je vous invite à ajouter une nouvelle méthode dans l'interface Reproduction, celle que vous souhaitez. Dès que vous ajoutez une nouvelle méthode abstraite dans cette interface, la classe Alien est aussitôt en erreur. Pour corriger cette erreur, vous pouvez redéfinir cette méthode dans la classe Alien ou alors donner un comportement par défaut à cette nouvelle méthode dans l'interface.

En résumé

  • Avec Java 8, une interface n'est plus une classe 100% abstraite.

  • Elle peut contenir du code sous deux formes :

    • avec des méthodes statiques;

    • avec une définition par défaut d'une méthode.

Exemple de certificat de réussite
Exemple de certificat de réussite