Tour of Scala

Классы Образцы

Language

Классы образцы (Case classes) похожи на обычные классы с несколькими ключевыми отличиями, о которых мы поговорим ниже. Классы образцы хороши для моделирования неизменяемых данных. На следующей странице обзора вы увидите, насколько они полезны для участия в сопоставлении с примером.

Объявление класса образца

Минимальный вариант объявления класса образца: указание ключевого слова case class, название и список параметров (которые могут быть пустыми). Пример:

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

Обратите внимание, что ключевое слово new не было использовано для создания экземпляра класса Book. Это связано с тем, что классы образцы по умолчанию имеют объект компаньон с методом apply, который берет на себя заботу о создании экземпляра класса.

При создании класса образца с параметрами, эти параметры являются публичными и неизменяемыми.

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("[email protected]", "[email protected]", "Ça va ?")

println(message1.sender)  // печатает [email protected]
message1.sender = "[email protected]"  // эта строка не компилируется

Вы не можете переназначить message1.sender, потому что это val (т.е. константа). Возможно использовать var в классах образцах, но это не рекомендуется.

Сравнение

Классы образцы сравниваются по структуре, а не по ссылкам:

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("[email protected]", "[email protected]", "Com va?")
val message3 = Message("[email protected]", "[email protected]", "Com va?")
val messagesAreTheSame = message2 == message3  // true

Даже если message2 и message3 ссылаются на разные объекты, значения каждого из них равны.

Копирование

Вы можете создать копию экземпляра класса образца, просто воспользовавшись методом copy. При этом по желанию можно изменить аргументы конструктора.

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("[email protected]", "[email protected]", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "[email protected]")
message5.sender  // [email protected]
message5.recipient // [email protected]
message5.body  // "Me zo o komz gant ma amezeg"

Получатель message4 использует в качестве отправителя message5, кроме параметра body который был скопирован из message4.

Дополнительные ресурсы

  • Дополнительная информация о классах образцах доступна в Scala Book

Contributors to this page: