/*
* 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");