Les classes de cas sont comme les autres classes avec quelques différences que nous allons présenter. Les classes de cas sont pratiques pour modéliser des données immuables. Dans la prochaine étape du tour, nous verrons comment elles peuvent être utilisées avec le pattern matching.
Définir une classe de cas
Une classe de cas requiert au minimum le mot clef case class
, un identifiant, et une liste de paramètres (qui peut être vide) :
case class Book(isbn: String)
val frankenstein = Book("978-0486282114")
Notez que le mot clef new
n’a pas été utilisé pour instancier la classe de cas Book
. C’est parce que la classe de cas a une méthode apply
par défaut qui prend en charge la construction de l’objet.
Quand vous créez une classe de cas avec des paramètres, les paramètres sont des val
publiques.
case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")
println(message1.sender) // prints guillaume@quebec.ca
message1.sender = "travis@washington.us" // cette ligne ne compile pas
Vous ne pouvez pas réaffecter message1.sender
parce que c’est une val
(càd. une valeur immuable). Il est possible d’utiliser des var
dans les classes de cas mais ce n’est pas recommandé.
Comparaison
Les instances des classes de cas sont comparées structurellement et non par référence :
case class Message(sender: String, recipient: String, body: String)
val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3 // true
Même si message2
et message3
font référence à des objets différents, les valeurs de chaque objet sont égales.
Copier
Vous pouvez créer une copie (superficielle) d’une instance de classe de cas simplement en utlisant la méthode copy
. Vous pouvez optionnellement changer les arguments du constructeur.
case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body // "Me zo o komz gant ma amezeg"
Le destinataire (recipient) de message4
est utilisé comment expéditeur (sender) du message message5
mais le body
du message4
a été directement copié.
Plus d’informations
- Apprennez-en plus sur les classes de cas dans Scala Book
Traduit par Antoine Pointeau.
Contributors to this page:
Contents
- Introduction
- Basics
- Unified Types
- Classes
- Default Parameter Values
- Named Arguments
- Traits
- Tuples
- Class Composition with Mixins
- Higher-order Functions
- Nested Methods
- Multiple Parameter Lists (Currying)
- Case Classes
- Pattern Matching
- Singleton Objects
- Regular Expression Patterns
- Extractor Objects
- For Comprehensions
- Generic Classes
- Variance
- Upper Type Bounds
- Lower Type Bounds
- Inner Classes
- Abstract Type Members
- Compound Types
- Self-types
- Implicit Parameters
- Implicit Conversions
- Polymorphic Methods
- Type Inference
- Operators
- By-name Parameters
- Annotations
- Packages and Imports
- Package Objects