Enum: représenter un type énuméré
Type Enuméré
Un type énuméré (enum) est une construction de programmation qui permet de définir un ensemble d'attributs dont les valeurs sont limitées à un nombre fini. Cela permet de donner un sens sémantique aux valeurs, rendant le code plus lisible et facile à maintenir.
Exemples de valeurs :
Mention au baccalauréat : assez bien, bien, très bien.
Jours de la semaine : lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche.
Concepts de Base
Type
Les types énumérés représentent un ensemble de valeurs spécifiques, en général sous forme d'une classe. Par exemple, en Java, char est un type primitif, tandis qu’un type énuméré est défini en énumérant tous les éléments possibles, ce qui aide les développeurs à restreindre les valeurs qu'une variable peut prendre.
Les valeurs énumérées ne peuvent pas être codées simplement par un booléen en raison du nombre de valeurs possibles; par conséquent, d'autres structures de données sont nécessaires pour une gestion efficace des enums.
Codages Posibles
Caractères
Entiers
Chaînes de caractères
Les codages par des nombres à virgule sont possibles mais généralement déconseillés, car ils peuvent obtenir des résultats imprécis.
Codage par des Entiers
L'utilisation d'entiers pour coder les valeurs d'un type énuméré a pour but de rendre les programmes plus compréhensibles et de simplifier le processus de définition des valeurs.
Exemple :
La classe java.util.Calendar utilise des entiers statiques tels que MONDAY, TUESDAY, etc. Dans ce système, chaque jour de la semaine a une représentation entière unique.
public class Calendrier {
public static final int LUNDI = 0;
public static final int MARDI = 1;
public static final int MERCREDI = 2;
public static final int JEUDI = 3;
public static final int VENDREDI = 4;
public static final int SAMEDI = 5;
public static final int DIMANCHE = 6;
}Les noms des variables sont traditionnellement complètement en majuscules, avec des underscores pour séparer les mots.
Le mot-clé
finalindique que les valeurs de ces variables sont constantes, ce qui est un aspect important des types énumérés.
Codage par des Chaînes de Caractères
Le codage de valeurs en utilisant des chaînes de caractères, bien qu'il soit possible, est généralement déconseillé pour plusieurs raisons :
Les comparaisons sont complexes et coûteuses en ressources, nécessitant une évaluation plus approfondie que celle effectuée avec des nombres entiers.
Par exemple, quand on compare "vendredi" et "samedi", bien que lexicalement "vendredi" soit plus grande, cela n'exprime pas les ordres de la semaine de manière appropriée.
Codage par des Objets grâce à Enum
Utiliser des objets pour définir un enum apporte plusieurs avantages, comme la possibilité d'afficher directement la valeur sous forme de chaîne à l'aide de toString() ou de comparer les valeurs avec compareTo().
Exemple de définition des jours de la semaine en enum :
enum Jour {LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE}Cette définition crée une classe contenant 7 variables constantes, où les jours de la semaine sont désignés comme des objets de la classe Jour. Par exemple, Jour.LUNDI renvoie une valeur d'objet définie.
Attributs internes des objets énumérés
Chaque objet énuméré a un attribut interne qui lui attribue une valeur, par exemple, Jour.LUNDI a une valeur associée qui est typiquement 0.
Méthodes de Classe Jour
ordinal() : renvoie l'entier qui correspond à la position de la valeur dans l'énumération.
toString() : renvoie la représentation de chaîne de caractères associée à la valeur de l'énumération.
compareTo() : compare les rangs qui sont inférés et stockés dans les objets énumérés.
Méthodes Statiques
values() : retourne toutes les valeurs de l’énumération dans l’ordre où elles ont été déclarées.
valueOf(String) : retourne l'objet énuméré associé à une chaîne de caractères donnée, par exemple,
Jour.valueOf("MARDI").
Exemples d'Utilisation d'un Enum
Voici un exemple où l’enum est utilisé pour définir le statut d’un match de football:
public enum Statut {A_VENIR, EN_COURS, TERMINE}Ce type énuméré peut ensuite être utilisé dans une classe MatchFoot pour contenir des informations sur le match. Les méthodes de cette classe peuvent gérer le déroulement du match en fonction de son statut, ce qui montre l’importance et la praticité des enums dans la programmation orientée objet.