Правильно ли определять все классы как случаи в Scala, чтобы все их аргументы делали свойства автоматически? - PullRequest
8 голосов
/ 31 августа 2010

Я начинаю Скала. Правильно ли я понимаю, что должен определить класс как класс case, если я хочу, чтобы его аргументы были представлены как свойства? Не вызывает ли это каких-либо побочных эффектов?

Ответы [ 4 ]

14 голосов
/ 31 августа 2010

Стандартный код, сгенерированный для классов дел, несет небольшую, но ненулевую стоимость в байт-коде. В дополнение к методу copy есть hashCode, equals и toString, а также метод фабрики сопутствующих объектов.

Более значительным является тот факт, что нецелесообразно выводить классы из тематических классов. Получение класса case из класса case действительно вызывает проблемы (и компилятор будет кричать на вас). В частности, компилятор не генерирует переопределяющий метод copy(...), поэтому вы можете получить несколько странных режимов сбоев, если попытаетесь скопировать класс case, полученный из класса case.

Если вы сохраните свои классы дел на листьях любых графов наследования, все будет в порядке.

12 голосов
/ 31 августа 2010

Вы получите свойства для любых определенных параметров, и они будут значениями (то есть финалами)

case class User(name: String, group: String)
val user = User("jsmith", "admins")

// access both properties
println("name: %s group: %s".format(user.name, user.group))

Вы также можете получить это поведение с обычными (то есть, не-классами):

// creates two final public properties as well
class User(val name: String, val group: String)

// creates read/write public properties
class User(var name: String, var group: String)
val user = new User("jsmith", "admins")
user.group = "guests"

Классы Case также приносят много других вещей, таких как полезные реализации равенства, hashcode и toString и объект-компаньон с фабричным методом, который устраняет необходимость использования new среди других вещей.

Как видите, класс кейсов не обязателен для достижения того, чего вы хотите, но он быстро доставит вас туда. Что касается побочных эффектов, то определение класса case генерирует некоторый фрагмент кода за кулисами, чтобы дать вам то, что было описано в предыдущем абзаце. Они часто полезны, и я не беспокоюсь о них, но полезно знать о них.

7 голосов
/ 31 августа 2010

В дополнение к уже упомянутым пунктам, класс case концептуально близок к тому, что вы бы назвали «классом значений» в Java. Конечно, ничто не мешает вам писать изменяемые классы прецедентов или классы прецедентов с тяжелой функциональностью, но мало данных, но это может удивить других, работающих с вашим кодом. Как правило, я бы сказал, что, по крайней мере, дважды подумайте, прежде чем создавать тематические классы ...

  • которые нуждаются в изменяемом состоянии
  • когда вы не уверены, что вам понадобятся подклассы позже
  • если их основная цель состоит в том, чтобы вычислять вещи (а не представлять вещи), и эти вычисления сложны
  • если вам нужен детальный контроль над их поведением (скажем, вам нужно пользовательское сопоставление с образцом)
  • когда производительность действительно важна
  • когда вам нужна только одна из «функций класса дел», например, Я хотел бы рассмотреть возможность использования класса case, чтобы избежать ввода "val" перед аргументами конструктора как overkill
4 голосов
/ 31 августа 2010

Остальные ответы все в порядке, но один реальный риск, который они пропускают, заключается в том, что у классов вариантов есть равенство значений, которое ведет себя совершенно иначе, чем стандартное объектно-ориентированное равенство идентификаторов.Два объекта case равны, если все их поля равны.Это именно то, что нужно в некоторых случаях, но очень неожиданно в других.В частности, добавление изменяемого состояния к чему-либо с равенством значений вызывает проблемы.Вы можете легко найти себя с объектами, хэш-код которых изменяется со временем, что приводит к повреждению HashMaps и другим подобным неприятностям.

Объявление чего-либо классом для сохранения нескольких нажатий клавиш, объявляя ваши свойства как "val", является ложной экономией, и когда-нибудь вас укусит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...