mika-el
3/19/2018 - 12:22 PM

Classes Anonymes & Fonctions Lambdas

/*
 * Classes anonymes
 * Utilisation des méthodes non redéfinies de la classe mère.
 * Obligation de redéfinir toutes les méthodes d'une interface.
 * Obligation de redéfinir les méthodes abstraites d'une classe abstraite.
 * Elles ne peuvent pas être déclarées abstract.
 * Elles ne peuvent pas non plus être déclarées static.
 * Elles ne peuvent pas définir de constructeur.
 * elles sont automatiquement déclarées  final: on ne peut dériver de cette classe, l'héritage est donc impossible !
 */
 
public static void main(String[] args) {
  Personnage pers = new Guerrier();
  pers.soigner();     
  pers.setSoin(new Operation());
  pers.soigner();
  
  //Utilisation d'une classe anonyme
  pers.setSoin(new Soin() {
		public void soigne() {
			System.out.println("Je soigne avec une classe anonyme ! ");
		}    	
  });
  pers.soigner();
}

/*
 * Fonctions Lambdas >= JAVA8
 * Les lambdas doivent êtres concises, sinon le code ne sera pas plus lisible qu'avec une classe anonyme habituelle.
 * Elles doivent être simple à comprendre pour que le débogage reste trivial en cas de problème.
 * Ce sont deux choses à avoir à l'esprit sous peine de complexifier votre travail au lieu de le simplifier.
 */
  
// Création d'une interface fonctionnelle.
@FunctionalInterface
public interface Dialoguer {
	public void parler(String question);
}

// Redefinition de la méthode parler avec une classe anonyme.
Dialoguer d = new Dialoguer() {
	public void parler(String question) {
		System.out.println("Tu as dis : " + question);	
	}
};
d.parler("Bonjour");

// Redefinition de la méthode parler avec une fonction lambda.
Dialoguer d = (s) -> System.out.println("Tu as dis : " + s);
d.parler("Bonjour");