Классы case
Неизменяемые носители данных
«Классы case» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Что такое класс case?
Класс case — это особый вид класса, предназначенный для хранения неизменяемых данных. Он объявляется с помощью case class.
Scala автоматически создаёт для него множество полезного кода, поэтому классы case — основной способ моделирования данных.
Объявление класса
Просто перечислите поля в списке параметров. Каждый параметр становится неизменяемым полем.
Для создания экземпляра ключевое слово new не требуется.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(p.x)
println(p.y)
}
}Автоматический toString
Классы case бесплатно получают удобный для чтения toString, отображающий имя класса и значения его полей.
Это значительно упрощает отладку и ведение журнала.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p)
}
}Равенство по значению
Классы case сравниваются по значению, а не по ссылке. Два экземпляра с одинаковыми полями равны.
Обычные классы вместо этого сравнивались бы по идентичности.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val a = Point(1, 2)
val b = Point(1, 2)
println(a == b)
}
}Неизменяемые поля
Поля классов case по умолчанию являются val, поэтому им нельзя присвоить новое значение.
Чтобы получить изменённую версию, создайте новый экземпляр вместо изменения старого.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p.x)
}
}Метод copy
У каждого класса case есть метод copy. Он создаёт новый экземпляр и позволяет изменить только указанные Вами поля.
Это идиоматичный способ обновления неизменяемых данных.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
val moved = p.copy(y = 99)
println(p)
println(moved)
}
}Поддержка сопоставления с шаблоном
Классы case без проблем работают с match. Их можно деконструировать, указав поля в шаблоне.
Это одна из главных причин их использовать.
case class Point(x: Int, y: Int)
object Main {
def describe(p: Point): String = p match {
case Point(0, 0) => "origin"
case Point(x, 0) => s"on x-axis at $x"
case Point(x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(describe(Point(0, 0)))
println(describe(Point(5, 0)))
println(describe(Point(2, 3)))
}
}Значения параметров по умолчанию
Как и обычные классы, классы case могут иметь значения параметров по умолчанию, поэтому при создании их можно не указывать.
case class User(name: String, active: Boolean = true)
object Main {
def main(args: Array[String]): Unit = {
val u1 = User("Ada")
val u2 = User("Bo", false)
println(u1)
println(u2)
}
}Добавление методов
Класс case может иметь собственные методы в теле, как и любой класс. Они работают с неизменяемыми полями.
case class Rect(w: Int, h: Int) {
def area: Int = w * h
}
object Main {
def main(args: Array[String]): Unit = {
val r = Rect(3, 4)
println(r.area)
}
}Зачем нужны классы case?
Классы case бесплатно предоставляют:
- Компактный конструктор с неизменяемыми полями
- Удобный для чтения
toString equalsиhashCode, основанные на значении- Метод
copy - Полноценную поддержку сопоставления с шаблоном
Они составляют основу моделирования данных в Scala.
Собираем всё вместе
В этом примере класс case создаётся, копируется, сравнивается и сопоставляется с шаблоном.
case class Money(amount: Int, currency: String)
object Main {
def main(args: Array[String]): Unit = {
val price = Money(10, "USD")
val sale = price.copy(amount = 8)
println(price == sale)
sale match {
case Money(a, "USD") => println(s"$a dollars")
case Money(a, c) => println(s"$a $c")
}
}
}Быстрая проверка
Проверьте своё понимание классов case.
Итоги
Вы узнали, что класс варианта моделирует неизменяемые данные и автоматически получает вспомогательные возможности:
- Создаётся без
new; поля являются неизменяемымиval - Бесплатный
toString, сравнение по значению черезequals/hashCode copyсоздаёт изменённые копии- Встроенная поддержка сопоставления с образцом
- Разрешены значения по умолчанию и пользовательские методы
Часто задаваемые вопросы
Урок «Классы case» бесплатный?
Да — полный текст урока «Классы case» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Классы case»?
Неизменяемые носители данных Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Классы case»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.