Я изучаю Scala и Akka, и в своем недавнем поиске решения я нашел что-то вроде
case class TotalTaxResult(taxAmount:Double)
case object TaxCalculationTimeout
В чем разница между двумя?
Когда я должен использовать один над другим?
Я изучаю Scala и Akka, и в своем недавнем поиске решения я нашел что-то вроде
case class TotalTaxResult(taxAmount:Double)
case object TaxCalculationTimeout
В чем разница между двумя?
Когда я должен использовать один над другим?
Класс case может принимать аргументы, поэтому каждый экземпляр этого класса case может быть различным в зависимости от значений его аргументов. Объект case, с другой стороны, не принимает аргументы в конструкторе, поэтому может быть только один его экземпляр (синглтон, как обычный scala object
).
Если ваше сообщение вашему актеру не требует какого-либо дифференциации значений, используйте объект case. Например, если у вас был актер, который выполнял какую-то работу, и вы, со стороны, хотели сказать ему, чтобы он работал, тогда, возможно, вы сделали бы что-то вроде этого:
case object DoWork
...
def receive = {
case DoWork =>
//do some work here
}
Но если вы хотите внести некоторые изменения в работу, вам может потребоваться переопределить ваше сообщение так:
case class DoWorkAfter(waitTime:Long)
...
def receive = {
case class DoWorkAfter(time) =>
context.system.scheduler.scheduleOnce(time.milliseconds, self, DoWork)
case DoWork =>
//do some work here
}
Объект case - это класс case singleton. Они используются как значения перечисления. Его можно использовать в сопоставлении с образцом, как и любое другое значение:
TaxCalculationTimeout match {
case TaxCalculationTimeout => println("hello")
}
Когда вы определяете класс case, вы создаете шаблон для экземпляров этого класса. TotalTaxResult(1.0)
и TotalTaxResult(2.0)
- два разных значения одного и того же типа. Если имеется ровно одно значение TaxCalculationTimeout
.
Вы можете думать об этих двух, чтобы они были как класс и объект в целом. Когда вы делаете класс класса ClassName (список параметров), он создает схему для создания объектов, а объект case определяет одноэлементный объект в области, в которой он объявлен. Начиная с Scala 2.10, вы всегда должны использовать объекты case вместо классов case без аргументов. Поэтому, когда вы хотите выполнить сопоставление шаблона с некоторыми значениями, для которых нужны аргументы, вы должны пойти для класса case, но если ваши значения не принимают аргументы, вы должны использовать объект case.
Простыми словами Scala является объектно-ориентированным и функциональным языком программирования. Он имеет функции функционального программирования, такие как сопоставление образцов с чисто объектно-ориентированной методологией.
Несколько раз нам нужно создать одноэлементный объект без какого-либо значения, например, передать некоторый сигнал для сопоставления шаблонов. Если Scala не имеет понятия объекта case, нам просто нужно использовать enum или равно некоторому строковому значению в сопоставлении. Но это не читаемость на чисто объектно-ориентированном языке.. В этом сценарии мы используем Case Object
Классы классов используются, когда нам нужно создать несколько объектов с разными значениями.