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

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

8
задан Ivan 31 August 2010 в 03:00
поделиться

2 ответа

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

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

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

14
ответ дан 5 December 2019 в 04:57
поделиться

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

  • , которые нуждаются в изменяемом состоянии
  • , когда вы не уверены, могут ли вам понадобиться подклассы позже
  • , если их основная цель состоит в том, чтобы вычислять вещи (а не представлять вещи), и эти вычисления сложны
  • , если вам нужен детальный контроль над их поведением (скажем, вам нужно сопоставление пользовательских шаблонов)
  • когда действительно важна производительность
  • когда вам нужно только одна из "функций класса case", например Я бы подумал об использовании case-класса только для того, чтобы не вводить «val» перед аргументами конструктора как излишний
7
ответ дан 5 December 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: