Pourquoi ne devrait-on pas utiliser des classes de cas exclusivement? P>
Après tout, ils favorisent l'immutabilité, la correspondance des motifs sur les méthodes accessoires, etc.? p>
3 Réponses :
Les gens utilisent fréquemment des classes de cas, puis essayez de les personnaliser / les abuser de faire autre chose que ce que les classes de cas sont censées faire.
E.g. Si vous voulez p>
Vous devez utiliser une classe normale, même si vous devez taper un peu plus. P>
Utilisez une classe de cas pour les données pures, immuables et publiques. Fondamentalement, un tuple avec des éléments nommés, rien de plus. Utilisez des classes normales pour E.G. Poignées à des ressources mutables (fichiers, contrôles d'interface graphique, etc.) p>
Les gens pensent fréquemment que vous pouvez abuser des classes de cas pour effectuer des tâches réservées aux classes normales. Voici donc un certain nombre d'exemples d'utilisation abusive des classes de cas: p>
membres d'une classe de cas ne sont jamais vraiment privés p> Vous pensez peut-être que, en faisant le constructeur privé, il est possible de faire respecter les invariants. Dans l'exemple ci-dessous, vous pouvez penser qu'il est impossible de créer une plage avec min> max. P> mais ce n'est pas le cas: p> Constructeur privé h3>
scala> val wrong = Range.create(2,1).copy(min = 1000)
wrong: Range = Range(1000,2)
Parce que vous n'en avez tout simplement pas besoin toujours. Par défaut, ils génèrent par défaut. getters publics pour champs. De plus, les classes de cas créent automatiquement un objet compagnon avec le même nom que la classe, qui contient Appliquer code> et non apply code>. P>
Les classes de cas ne sont pas universellement bonnes. Ils sont inutiles lorsque vous ne voulez pas tous vos champs publics et / ou ne vous souciez pas de la logique de comparaison et de clonage par défaut, ou lorsque vous avez besoin d'un accesseur non trivial ou d'une logique d'initialisateur. p>
Ils ne peuvent pas non plus avoir plus de 22 membres et vous ne pouvez pas construire des hiérarchies d'entre eux (au moins, pas exclusivement, car une héritage de cas à cas-à-cas est interdite, mais en prolonge même une classe de cas avec une classe normale t une très bonne idée). p>
Cela me semble comme une question technique parfaitement bonne; J'ai voté pour rouvrir.