Я начинаю Scala. Правильно ли я понимаю, что должен определить класс как класс case, если я хочу, чтобы его аргументы были представлены как свойства? Не вызывает ли это побочных эффектов?
Шаблонный код, сгенерированный для классов case, имеет небольшую, но не нулевую стоимость в байт-коде. В дополнение к методу copy
существует hashCode
, equals
и toString
, а также метод фабрики сопутствующих объектов.
Более важным является тот факт, что нецелесообразно выводить классы из классов случаев. Наследование case-класса от case-класса действительно вызывает проблемы (и компилятор будет орать на вас). В частности, компилятор не генерирует переопределяющий метод copy(...)
, поэтому при попытке скопировать класс case, производный от класса case, вы можете столкнуться с некоторыми странными режимами отказа.
Если вы будете хранить классы case на концах любого графа наследования, все будет в порядке.
В дополнение к уже упомянутым пунктам, класс case концептуально близок к тому, что вы бы назвали "классом значения" в Java. Конечно, ничто не мешает вам писать изменяемые классы case или классы case с большой функциональностью, но с небольшим количеством данных, но это может удивить других, работающих с вашим кодом. Как правило, я бы сказал, по крайней мере, дважды подумайте, прежде чем создавать case-классы...