Почему "класс case" не нужен "новый" для создания нового объекта

В Scala в чем причина, почему вам не нужно использовать "новый" для создания нового "класса case"? Я пробовал искать некоторое время без ответов.

Ответ 1

Вы хотите, как и почему? Как отмечается в другом ответе, как только метод apply для автоматически созданного объекта-компаньона.

Для чего: классы case часто используются для реализации алгебраических типов данных в Scala, а конструктор new -less позволяет более элегантный код (создание значения больше похоже на деконструирование его с помощью сопоставления с образцом, например) и более близкое к синтаксису ADT на других языках.

Ответ 3

В классах классов вы предоставляете автоматически созданную apply функцию на своем сопутствующем объекте, который можно использовать как конструктор.

В Scala декомпилированном байт-коде вы найдете функцию apply, созданную следующим образом:

object Person {
def apply(name: String, age: Integer): Person = new Person(name,age)
}

Пример:

case class Person(name: String, age: Integer)

Следующие три команды выполняют одно и то же.

val p0 = new Person("Frank", 23) // normal constructor

val p1 = Person("Frank", 23) // this uses apply

val p2 = Person.apply("Frank", 23) // using apply manually

Итак, если вы используете val p1 = Person("Frank", 23) , это не конструктор, это метод, вызывающий метод apply.

Подробнее читайте scala-object-apply-functions.