В Scala в чем причина, почему вам не нужно использовать "новый" для создания нового "класса case"? Я пробовал искать некоторое время без ответов.
Почему "класс case" не нужен "новый" для создания нового объекта
Ответ 1
Вы хотите, как и почему? Как отмечается в другом ответе, как только метод apply
для автоматически созданного объекта-компаньона.
Для чего: классы case часто используются для реализации алгебраических типов данных в Scala, а конструктор new
-less позволяет более элегантный код (создание значения больше похоже на деконструирование его с помощью сопоставления с образцом, например) и более близкое к синтаксису ADT на других языках.
Ответ 2
В классе Case создан предварительно созданный объект-компаньон с apply()
. Кто-то даже жалуется на это: Как переопределить заявку в компаньоне класса case:)
Ответ 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.