0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Классы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Классы case
  2. Запечатанные трейты
  3. Алгебраические типы данных
  4. Полное сопоставление
← Назад к Scala for Backend Engineering & Functional Programming