Scala for Backend Engineering & Functional Programming · Leçon

Énumérations dans Scala 3

Nouvelle syntaxe des énumérations

Leçon 2 sur 413 étapes

Énumérations dans Scala 3 est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Scala for Backend Engineering & Functional Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.

Le nouveau mot-clé enum

Scala 3 ajoute une construction énumération de premier ordre. Elle remplace la structure verbeuse fondée sur un trait scellé et des objets de cas de Scala 2 par une syntaxe concise.

  • Chaque cas devient une valeur du type énuméré.
  • Le compilateur génère automatiquement des utilitaires pratiques.
enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    println(Color.Red)

Lister toutes les valeurs

Chaque énumération simple possède un compagnon avec values (un tableau de tous les cas) et valueOf (recherche par nom).

enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    Color.values.foreach(println)
    println(Color.valueOf("Green"))

Numéro ordinal et nom

Chaque valeur d’énumération possède un ordinal (position commençant à zéro) et un toString généré à partir du nom de son cas.

enum Color:
  case Red, Green, Blue

object Main:
  def main(args: Array[String]): Unit =
    println(Color.Blue.ordinal)
    println(Color.Red.ordinal)

Énumérations avec paramètres

Les cas d’une énumération peuvent accepter des paramètres de constructeur, ce qui associe des données à chaque valeur. C’est utile pour stocker des constantes telles que des codes RGB ou des masses planétaires.

enum Planet(val mass: Double):
  case Earth extends Planet(5.97e24)
  case Mars  extends Planet(6.42e23)

object Main:
  def main(args: Array[String]): Unit =
    println(Planet.Earth.mass)
    println(Planet.Mars.mass)

Méthodes sur les énumérations

Vous pouvez définir des méthodes dans le corps d’une énumération. Elles sont disponibles sur chaque valeur, comme les méthodes d’une classe.

enum Direction:
  case North, South, East, West
  def opposite: Direction = this match
    case North => South
    case South => North
    case East  => West
    case West  => East

object Main:
  def main(args: Array[String]): Unit =
    println(Direction.North.opposite)

Énumérations ADT génériques

Les énumérations peuvent être génériques et paramétrées, ce qui permet de modéliser des types de données algébriques. Voici un type Option simplifié.

enum Maybe[+A]:
  case Just(value: A)
  case Nothing

object Main:
  def main(args: Array[String]): Unit =
    val a: Maybe[Int] = Maybe.Just(42)
    println(a)

Énumérations ADT récursives

Les énumérations sont particulièrement adaptées aux structures récursives. Un arbre binaire ou une liste chaînée se lit clairement comme un ensemble de cas.

enum Tree[+A]:
  case Leaf(value: A)
  case Branch(left: Tree[A], right: Tree[A])

object Main:
  def main(args: Array[String]): Unit =
    val t = Tree.Branch(Tree.Leaf(1), Tree.Leaf(2))
    println(t)

Correspondance de motifs sur les énumérations

Comme les énumérations sont scellées, le compilateur peut vérifier l’exhaustivité d’un match. L’absence d’un cas déclenche un avertissement.

enum Light:
  case Red, Yellow, Green

object Main:
  def action(l: Light): String = l match
    case Light.Red    => "stop"
    case Light.Yellow => "slow"
    case Light.Green  => "go"

  def main(args: Array[String]): Unit =
    println(action(Light.Green))

Énumérations compatibles avec Java

Ajoutez le comportement de extends java.lang.Enum en dérivant automatiquement de scala.reflect.Enum ; pour une véritable interopérabilité avec Java, écrivez enum X extends Enum[X]... mais la plupart du code utilise simplement la forme standard, qui s’intègre bien à Java lorsque cela est nécessaire.

enum Suit:
  case Hearts, Diamonds, Clubs, Spades

object Main:
  def main(args: Array[String]): Unit =
    println(Suit.values.length)
    println(Suit.Spades.ordinal)

Combiner champs et méthodes

Vous pouvez combiner des cas paramétrés avec des méthodes partagées pour créer des modèles de domaine riches.

enum Currency(val symbol: String):
  case USD extends Currency("$")
  case EUR extends Currency("\u20ac")
  def format(amount: Double): String = s"$symbol$amount"

object Main:
  def main(args: Array[String]): Unit =
    println(Currency.USD.format(9.99))

Quand utiliser enum

Utilisez enum lorsque vous avez un ensemble fermé de choix ou un type de données algébrique.

  • Des cas simples pour les énumérations ordinaires.
  • Des cas paramétrés pour les ADT et les types somme.
  • La vérification gratuite de l’exhaustivité sécurise les remaniements.
enum Result[+E, +A]:
  case Ok(value: A)
  case Err(error: E)

object Main:
  def main(args: Array[String]): Unit =
    val r: Result[String, Int] = Result.Ok(7)
    println(r)

Vérification rapide

Vérifiez votre compréhension des énumérations de Scala 3.

Récapitulatif

Vous avez appris les énumérations de Scala 3.

  • La construction concise enum remplace le code répétitif des traits scellés.
  • Les énumérations simples obtiennent values, valueOf et ordinal.
  • Les cas peuvent accepter des paramètres pour stocker des données associées.
  • Les énumérations génériques et récursives modélisent les ADT.
  • Leur nature scellée permet une correspondance de motifs exhaustive.
enum Weekday:
  case Mon, Tue, Wed, Thu, Fri
  def isStart: Boolean = this == Mon

object Main:
  def main(args: Array[String]): Unit =
    println(Weekday.Mon.isStart)
    println(Weekday.values.length)
Gratuit pour commencer

Apprends Scala avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
39
Leçons
143

Questions Fréquemment Posées

La leçon « Énumérations dans Scala 3 » est-elle gratuite ?

Oui — le texte complet de « Énumérations dans Scala 3 » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Scala for Backend Engineering & Functional Programming, passe à CoddyKit PRO. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Énumérations dans Scala 3 » ?

Nouvelle syntaxe des énumérations Tu pratiques Scala for Backend Engineering & Functional Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Scala for Backend Engineering & Functional Programming ?

Aucune expérience préalable n'est requise. Scala for Backend Engineering & Functional Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Énumérations dans Scala 3 » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Scala for Backend Engineering & Functional Programming ?

Oui. Chaque leçon Scala for Backend Engineering & Functional Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Indentation significative
  2. Énumérations dans Scala 3
  3. Types opaques
  4. Types union et intersection
← Retour à Scala for Backend Engineering & Functional Programming