vendredi 24 novembre 2023

[Java 17] Améliorer la conception logicielle avec les sealed classes

 Introduction

Dans le monde de la programmation orientée objet, l’héritage est un concept fondamental qui permet à une classe d’hériter des attributs et des méthodes d’une autre classe. Cependant, le contrôle de l’héritage peut être un défi. C’est là qu’interviennent les classes scellées de Java 17.

Problématique
Dans la conception de logiciels, il est courant de vouloir limiter l’héritage à un ensemble spécifique de classes. Par exemple, vous pouvez avoir une classe OrderState et vouloir que seules certaines classes spécifiques, comme NewOrder, ProcessedOrder, ShippedOrder et DeliveredOrder, puissent en hériter. Sans les classes scellées, n’importe quelle classe pourrait hériter de votre classe, ce qui pourrait conduire à une utilisation non désirée ou imprévue de votre classe.

Solution
Les sealed  classes de Java 17 offrent une solution à ce problème. Une classe scellée est une classe ou une interface qui restreint les autres classes ou interfaces qui peuvent l’étendre. Cela vous permet de contrôler précisément quels états sont possibles pour une commande et d’associer des comportements spécifiques à chaque état. De plus, cela permet au compilateur de vérifier que vous gérez tous les états possibles dans votre code, ce qui peut aider à prévenir les erreurs.

Exemple d’implémentation
Pour illustrer l’utilisation des classes scellées dans la gestion de l’état d’une commande, considérons l’exemple suivant :

public sealed interface OrderState permits NewOrder, ProcessedOrder, ShippedOrder, DeliveredOrder {
    void handle();
}

public final class NewOrder implements OrderState {
    @Override
    public void handle() {
        System.out.println("Handling a new order.");
    }
}

public final class ProcessedOrder implements OrderState {
    @Override
    public void handle() {
        System.out.println("Handling a processed order.");
    }
}

public final class ShippedOrder implements OrderState {
    @Override
    public void handle() {
        System.out.println("Handling a shipped order.");
    }
}

public final class DeliveredOrder implements OrderState {
    @Override
    public void handle() {
        System.out.println("Handling a delivered order.");
    }
}

Dans cet exemple, OrderState est une interface scellée qui peut être implémentée uniquement par les classes NewOrder, ProcessedOrder, ShippedOrder et DeliveredOrder. Chaque classe représente un état différent d’une commande et peut avoir des comportements spécifiques. Par exemple, pour une NewOrder, la méthode handle() pourrait créer une nouvelle entrée dans une base de données, tandis que pour une DeliveredOrder, elle pourrait envoyer un e-mail de confirmation au client.

Discussion
L’utilisation des sealed  classes peut améliorer la sécurité, l’exhaustivité et les performances de votre code. Cependant, elles sont une fonctionnalité relativement récente de Java, introduite en aperçu dans Java 15 et stabilisée dans Java 17. Il est donc possible que de nombreux frameworks et bibliothèques n’aient pas encore adopté cette fonctionnalité. Néanmoins, les sealed  classes offrent un moyen puissant de contrôler l’héritage et peuvent être un outil précieux pour améliorer la conception de vos logiciels.

Aucun commentaire:

Enregistrer un commentaire

to criticize, to improve