Где классы случая не должны использоваться в Scala?

Классы случая в Scala являются стандартными классами, улучшенными с сопоставлением с образцом, равняется... (или я неправильно?). Кроме того, они не требуют никакого "нового" ключевого слова для своего instanciation. Мне кажется, что они более просты определить, чем регулярные классы (или я снова неправильно?).

Существует много веб-страниц, говорящих, где они должны использоваться (главным образом о шаблоне, соответствующем). Но где их нужно избежать? Почему мы не используем их везде?

25
задан Alban Linard 22 January 2010 в 18:35
поделиться

4 ответа

Существует много мест, где классы корпуса не являются адекватными:

  • , когда кто-то желает скрыть структуру данных.
  • как часть иерархии типа более двух или трех уровней.
  • Когда конструктор требует особых соображений.
  • Когда экстрактор требует особых соображений.
  • Когда равенство и код хэша требуют особых соображений.

Иногда эти требования представлены поздно в дизайне и требуют, чтобы кто-то преобразовал класс корпуса в нормальный класс. Поскольку преимущества класса Case на самом деле не все, что отлично - помимо немногих особых случаев, которые они были специально сделаны - моя собственная рекомендация - не , чтобы сделать что-либо класс дела, если нет Используйте для этого.

Или, другими словами, не перерабатывайте.

20
ответ дан 28 November 2019 в 21:25
поделиться

Наследование из классов Case проблематично. Предположим, у вас есть код, как так:

case class Person(name: String) { }

case class Homeowner(address: String,override val name: String)
  extends Person(name) { }

scala> Person("John") == Homeowner("1 Main St","John")
res0:  Boolean = true

scala> Homeowner("1 Main St","John") == Person("John")
res1: Boolean = false

Возможно, это то, что вы хотите, но обычно Вы хотите A == B если и только если B == a. К сожалению, компилятор не может разумно исправить это для вас автоматически.

Это становится еще хуже, потому что Hashcode человек («Джон») не совпадает с Hashcode of домовладельца («1 главный ст», «Джон») , Так что теперь равняется действиях странных и HashCode действует странно.

Пока вы знаете, чего ожидать, наследование из классов чехлов может дать понятные результаты, но он пришел к просмотру как плохую форму (и, таким образом, был устарел в 2.8).

16
ответ дан 28 November 2019 в 21:25
поделиться

Может быть заманчиво использовать классы Case, потому что вы хотите бесплатно ToString / Countail / hashcode. Это может вызвать проблемы, поэтому избегать этого.

Я желаю, чтобы возникла аннотация, которая позволила вам получить эти удобные вещи, не делая класс дела, но, возможно, это сложнее, чем звучит.

0
ответ дан 28 November 2019 в 21:25
поделиться

Я бы сказал, что это сумасшедшее количество параметров, которые должны быть введены.

Стремиться к одному параметру, возможно, 2 больше всего, что находится почти все возможные сценарии , и, конечно, должен быть интерфейс. Любое больше, и я чувствую запах крысы (дизайнерский недостаток).

-121--1143758-

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

1
ответ дан 28 November 2019 в 21:25
поделиться
Другие вопросы по тегам:

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