Я искал в Google, чтобы найти различия между а case class
и а class
. Все упоминают, что когда вы хотите выполнить сопоставление с образцом в классе, используйте case case. В противном случае используйте классы, а также упомяните некоторые дополнительные привилегии, такие как equals и переопределение хеш-кода. Но являются ли это единственными причинами, по которым следует использовать класс case вместо класса?
Я думаю, что в Scala должна быть какая-то очень важная причина. Каково объяснение или есть ресурс, чтобы узнать больше о тематических классах Scala?
источник
Технически, нет никакой разницы между классом и классом case - даже если компилятор оптимизирует некоторые вещи при использовании case-классов. Тем не менее, класс вариантов используется, чтобы покончить с котлом для конкретного шаблона, который реализует алгебраические типы данных .
Очень простым примером таких типов являются деревья. Например, двоичное дерево может быть реализовано так:
Это позволяет нам сделать следующее:
Обратите внимание, что деревья конструируют и деконструируют (посредством сопоставления с образцом) с одинаковым синтаксисом, который также является точным способом их печати (минус пробелы).
И их также можно использовать с хэш-картами или наборами, поскольку они имеют действительный, стабильный хэш-код.
источник
(Вы уже упомянули все, кроме последнего).
Это единственные отличия от обычных классов.
источник
Никто не упомянул, что case-классы также являются экземплярами
Product
и таким образом наследуют эти методы:где
productArity
возвращает количество параметров класса,productElement(i)
возвращает i- й параметр иproductIterator
позволяет перебирать их.источник
Никто не упомянул, что case-классы имеют
val
параметры конструктора, но это также по умолчанию для обычных классов (что я считаю несоответствием в дизайне Scala). Дарио подразумевал такие, где он отметил, что они « неизменны ».Обратите внимание, что вы можете переопределить значение по умолчанию, добавив каждый аргумент конструктора
var
к классам case. Однако, делая изменяемые классы case приводит к тому, что ихequals
иhashCode
методы изменяются во времени.sepp2k уже упоминал, что case-классы автоматически генерируют
equals
иhashCode
методы.Также никто не упомянул, что case-классы автоматически создают компаньона
object
с тем же именем, что и класс, который содержитapply
иunapply
методы.apply
Метод позволяет строить экземпляры без предваряя сnew
. Методunapply
экстрактора обеспечивает сопоставление с шаблоном, упомянутым другими.Кроме того , компилятор оптимизирует скорость
match
-case
сопоставления с образцом для случая классов [2].[1] Классные кейсы классные
[2] Классы дел и экстракторы, стр. 15 .
источник
Конструкцию case-класса в Scala также можно рассматривать как удобство для удаления некоторого шаблона.
При построении кейса класс Scala дает вам следующее.
apply
метод, который вы можете использовать как фабричный метод. Вы получаете преимущество синтаксического сахара в том, что вам не нужно использовать новое ключевое слово.Поскольку класс является неизменным, вы получаете методы доступа, которые являются просто переменными (или свойствами) класса, но не имеют мутаторов (поэтому нет возможности изменять переменные). Параметры конструктора автоматически доступны для вас как общедоступные поля только для чтения. Гораздо приятнее в использовании, чем конструкция Java bean.
hashCode
,equals
иtoString
методы по умолчанию, иequals
метод сравнивает объект структурно.copy
Метод генерируется , чтобы иметь возможность клонировать объект (с некоторыми полями , имеющими новые значения , предоставленных методом).Самым большим преимуществом, как уже упоминалось ранее, является тот факт, что вы можете использовать сопоставление с образцом в классах case. Причина этого в том, что вы получаете
unapply
метод, который позволяет деконструировать класс case для извлечения его полей.По сути, то, что вы получаете от Scala при создании класса case (или объекта case, если ваш класс не принимает аргументов), является одноэлементным объектом, который служит цели как фабрика и как экстрактор .
источник
copy
метод может изменить поля:val x = y.copy(foo="newValue")
Помимо того , что люди уже сказали, есть еще некоторые основные различия между
class
иcase class
1.
Case Class
не требует явногоnew
, в то время как класс должен быть вызван сnew
2. Параметры конструкторов по умолчанию являются закрытыми
class
, а открытыми -case class
3.
case class
сравнить себя по значениюисточник
Согласно документации Scala :
Еще одной особенностью ключевого слова case является то, что компилятор автоматически генерирует для нас несколько методов, включая знакомые методы toString, equals и hashCode в Java.
источник
Учебный класс:
Но если мы используем тот же код, но используем case case:
Персональный класс:
Шаблон соответствия:
объект: синглтон:
источник
Чтобы иметь полное представление о том, что такое кейс-класс:
давайте предположим следующее определение класса дела:
а затем выполните следующие действия в терминале:
Scala 2.12.8 выведет:
Как мы видим, компилятор Scala создает обычный класс
Foo
и объект-компаньонFoo
.Давайте пройдемся по скомпилированному классу и прокомментируем, что мы получили:
Foo
класса, неизменяемое:scala.Product
черта реализации :scala.Equals
черты для экземпляров класса make case, сравнимых по равенству==
:java.lang.Object.hashCode
для выполнения контракта equals-hashcode:java.lang.Object.toString
:new
ключевому слову:Object Foo: - метод
apply
для создания экземпляра безnew
ключевого слова:unupply
для использования класса case Foo в сопоставлении с образцом:scala.runtime.AbstractFunction2
на такие трюки:tupled
Объект from возвращает функцию для создания нового Foo, применяя кортеж из 2 элементов.Так что класс case - это просто синтаксический сахар.
источник
В отличие от классов, case-классы используются только для хранения данных.
Классы дел являются гибкими для приложений, ориентированных на данные, что означает, что вы можете определять поля данных в классе дел и определять бизнес-логику в сопутствующем объекте. Таким образом, вы отделяете данные от бизнес-логики.
С помощью метода копирования вы можете наследовать любые или все необходимые свойства из источника и изменять их по своему усмотрению.
источник
Никто не упомянул, что сопутствующий объект case-класса имеет
tupled
defention, который имеет тип:Единственный вариант использования, который я могу найти, это когда вам нужно создать класс case из кортежа, например:
Вы можете сделать то же самое без кортежей, создав объект напрямую, но если ваши наборы данных, выраженные в виде списка кортежей с арностью 20 (кортеж с 20 элементами), могут использовать тьюплы - ваш выбор.
источник
Класс случае это класс , который может быть использован с
match/case
заявлением.Вы видите, что
case
за ним следует экземпляр класса Fun, вторым параметром которого является Var. Это очень хороший и мощный синтаксис, но он не может работать с экземплярами любого класса, поэтому существуют некоторые ограничения для классов case. И если эти ограничения соблюдаются, можно автоматически определить хэш-код и равно.Расплывчатая фраза «рекурсивный механизм декомпозиции через сопоставление с образцом» означает просто «с ним работает
case
». (Действительно, экземпляр, за которымmatch
следует, сравнивается (сопоставляется) с экземпляром, который следуетcase
, Scala должен разложить их обоих и рекурсивно разложить то, из чего они сделаны.)Какие тематические классы полезны для? Статья Википедии о типах данных Алгебраических дает две хорошие классические примеры, списки и дерева. Поддержка алгебраических типов данных (включая умение их сравнивать) является обязательной для любого современного функционального языка.
Какие классы случаев являются не полезно? Некоторые объекты имеют состояние, код
connection.setConnectTimeout(connectTimeout)
не для классов case.И теперь вы можете прочитать Тур по Scala: Case Classes
источник
Я думаю, что в целом все ответы дали семантическое объяснение о классах и тематических классах. Это может быть очень актуально, но каждый новичок в Scala должен знать, что происходит, когда вы создаете кейс-класс. Я написал этот ответ, который объясняет класс случая в двух словах.
Каждый программист должен знать, что если они используют какие-либо предварительно созданные функции, то они пишут сравнительно меньше кода, что дает им возможность писать наиболее оптимизированный код, но это связано с большими обязанностями. Поэтому используйте готовые функции с очень большой осторожностью.
Некоторые разработчики избегают писать классы case из-за дополнительных 20 методов, которые вы можете увидеть, разобрав файл class.
Пожалуйста, обратитесь по этой ссылке, если вы хотите проверить все методы внутри класса case .
источник
источник
Некоторые из ключевых особенностей
case classes
перечислены нижеnew
ключевого слова.Пример кода Scala на скрипке Scala, взятый из документов Scala.
https://scalafiddle.io/sf/34XEQyE/0
источник