Maison >Java >javaDidacticiel >Règles de classe scellées en Java

Règles de classe scellées en Java

Patricia Arquette
Patricia Arquetteoriginal
2024-10-08 22:12:31875parcourir

Sealed class rules in Java

Les classes scellées sont une nouvelle fonctionnalité introduite dans les versions Java 15 et supérieures, conçue pour offrir plus de contrôle et de flexibilité sur l'héritage de classe au sein d'un module. Une classe scellée impose certaines contraintes à ses sous-classes, permettant une structure restreinte et organisée de hiérarchie de classes.

Pour commencer, une classe scellée et ses sous-classes doivent appartenir au même module, ou si elles sont déclarées dans un module sans nom, au même package. Cela garantit que toutes les classes au sein de la hiérarchie d'une classe scellée sont accessibles et gérables dans un environnement spécifique.

De plus, chaque sous-classe autorisée doit étendre directement la classe scellée. Cela garantit une hiérarchie claire et concise, sans qu'aucune sous-classe ne se ramifie de manière inattendue.

Ensuite, chaque sous-classe autorisée doit choisir un modificateur pour décrire comment elle poursuit le scellement initié par sa superclasse. Il existe trois options pour ces modificateurs :

1) Final : Ce modificateur fait de la sous-classe le dernier niveau de la hiérarchie des classes, interdisant toute extension supplémentaire.

2) Scellé : Ce modificateur permet à la sous-classe d'être étendue davantage, mais de manière restreinte. Toutes les sous-classes d'une sous-classe scellée doivent être explicitement autorisées par la superclasse scellée.

3) Non scellé : Ce modificateur ramène la partie de la hiérarchie de la sous-classe à un état ouvert, permettant aux sous-classes inconnues de l'étendre.

À titre d'exemple, considérons une classe Shape déclarée comme scellée, avec deux sous-classes autorisées : Circle et Square. Dans ce cas, Circle peut être déclaré final, tandis que Square peut être déclaré non scellé, permettant à des sous-classes inconnues de l'étendre davantage.

Il est important de noter qu'une classe ne peut avoir qu'un seul modificateur parmi final, scellé et non scellé. Il n'est pas possible qu'un cours soit scellé et définitif en même temps, car ils servent des objectifs opposés.

De plus, les classes abstraites peuvent également être déclarées comme scellées ou non scellées et peuvent avoir des membres abstraits. Les classes scellées peuvent autoriser les sous-classes abstraites à condition qu'elles soient également scellées ou non.

Enfin, l'accessibilité d'une sous-classe autorisée ne doit pas nécessairement correspondre à celle de la classe scellée. Les sous-classes peuvent être moins accessibles, tant qu'elles restent accessibles à la classe scellée. Cela peut empêcher certains utilisateurs de basculer de manière exhaustive entre les sous-classes sans clause par défaut dans la future version lorsque la correspondance de modèles est prise en charge par les commutateurs.

Pour mieux comprendre le concept de classes scellées, examinons quelques exemples de codage.

Dans l'extrait de code ci-dessous, une classe scellée Devise est définie.

sealed class Currency permits Dinar {
    //:sealed Check out the non-sealed class inheritance for legal recommendations
}

Pour qu'une sous-classe légale soit créée, la classe doit être déclarée dans le même module et étendre directement la classe Currency. Une classe scellée ne peut pas empêcher ses sous-classes autorisées de s'étendre davantage de manière restreinte ou d'être ouvertes à l'extension par des sous-classes inconnues. Dinar doit donc être dans le même module.

En poussant l'extrait de code plus loin, la classe non scellée Dinar étend la classe scellée Devise. La classe non scellée permet de créer et d'étendre d'autres sous-classes.

public non-sealed class Dinar extends Currency {
    // This class can be extended by any unknown subclass
}

Alternativement, si nous voulons restreindre les sous-classes qui peuvent étendre Dinar, nous pouvons déclarer la classe comme scellée et spécifier quelles sous-classes sont autorisées via la clause permits.

sealed class Dinar extends Currency permits JordanianDinar, KuwaitiDinar {
    // Only subclasses JordanianDinar and KuwaitiDinar are permitted 
}

Les sous-classes JordanianDinar et KuwaitiDinar doivent être déclarées dans le même module que Dinar et doivent directement étendre la classe scellée Dinar. Ils peuvent être soit scellés, non scellés, voire définitifs, selon le niveau de restriction souhaité.

En utilisant des classes scellées, nous pouvons créer une hiérarchie de classes liées et avoir plus de contrôle sur les sous-classes qui peuvent être créées et étendues, offrant ainsi une meilleure encapsulation et une meilleure modularité dans notre code. Cela contribue également à améliorer la sécurité des types, car le compilateur peut nous avertir si nous essayons de créer une sous-classe illégale.

En conclusion, les classes scellées offrent une approche plus organisée et structurée de l'héritage de classe, permettant plus de contrôle et de flexibilité au sein d'un module. En imposant des restrictions sur les sous-classes et en offrant des options d'extension ultérieure, les classes scellées fournissent une hiérarchie de classes plus délibérée et intentionnelle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn