Subtilité sur les classes abstraites Java

Publié dans Java | Marqué avec , , ,
Share

J’ai découvert une petite subtilité dans l’utilisation des classes abstraites aujourd’hui. Imaginons une interface Java qui est partiellement implémentée par une classe abstraite. Cette classe abstraite est assez naturellement étendue par une bonne vieille classe Java (la version française du POJO ;p). Jusqu’ici tout va bien.

Exemple 1 : héritage Java

Exemple 1 : héritage Java

Maintenant, imaginons que les méthodes implémentées dans notre classe abstraite, utilisent des méthodes implémentées seulement dans notre POJO. C’est là qu’est la subtilité (que j’annonce subtilement).

Il est nécessaire d’ajouter le prototype des méthodes utilisées dans notre classe abstraite. Sinon, on obtient une jolie exception java.lang.NoSuchMethod.
Dans l’exemple ci-dessus, si AMyClass implémente method1 en faisant un appel à method2, il faut ajouter public abstract void method2(); dans le code de AMyClass.

java-inheritance-2

Ce qui donne en terme de code :

public interface IMyClass {
    public void method1();
    public void method2();
}
public abstract class AMyClass {
    public void method1() {
        // do stuff
        method2();
    }

    public abstract void method2();
}
public class MyClass {
    public void method2() {
        // do stuff
    }
}

Ceci étant dit, j’ai pu mettre en place une petite architecture pour simplifier mon code. Dans le cadre de composants assez gros, j’ai assez souvent des méthodes (que j’appelle) utilitaires qui apparaissent, ainsi que des méthodes dépréciées (@deprecated) qui ne veulent pas encore mourir de leur belle mort. Les premières ne servent qu’à faciliter l’écriture de code en permettant d’appeler une méthode d’une manière ou d’une autre. Les secondes ne sont que les vestiges d’une époque révolue, mais qui doivent continuer à fonctionner (jusqu’à leur fin) ce qui constitue une certaine pollution.
J’ai donc mis en place l’architecture suivante :
java-inheritance

Ainsi, l’interface que j’expose à mes utilisateurs contient toutes les méthodes proprement documentées. Quant à mon implémentation réelle, elle n’est pas polluée par tout un tas de méthodes dépréciées ou inutiles en terme de code. Sur de gros composants, ce genre de simplification n’a pas de prix !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *