Lors de cas d'utilisation de la classe ou de classe normale
J'ai une certaine incompréhension dans ce cas, je devrais en cas d'utilisation de la classe ou de classe régulière suivante par les meilleures pratiques. J'ai déjà lu sur les différences entre les deux classes, mais ne peut pas me l'imaginer exemples de la vie réelle où est recommandé pour les cas d'utilisation ou de classe régulière.
Quelqu'un pourrait-il me montrer des exemples concrets avec des explications pourquoi il est recommandé de le faire et pas autrement?
Vous devez vous connecter pour publier un commentaire.
Si vous vous apprêtez à écrire purement fonctionnelle de code avec des objets immuables, il est mieux d'essayer éviter à l'aide de classes régulières.
L'idée principale du paradigme fonctionnel est la séparation des structures de données et les opérations sur celles-ci.
Des Classes de cas sont une représentation d'une structure de données avec les méthodes nécessaires. Fonctions sur les données devraient être décrites dans les différentes entités du logiciel (par exemple, les traits, les objets).
Les classes régulières, au contraire, le lien entre les données et les opérations de fournir la mutabilité. Cette approche est plus proche du paradigme orienté objet.
En conséquence, ne pas utiliser de Cas des Classes si:
Toutefois, dans ces cas, pensez-vous vraiment que le style de votre code car il n'est probablement pas suffisamment fonctionnel.
Cas des Classes sont normales classes avec du sucre syntaxique. Donc ce n'est pas de grande différence, vous pouvez tout faire avec une classe de cas que vous pouvez faire avec une classe et vice versa.
Des classes de cas seulement vous faire économiser beaucoup de chaudière plaque de code à écrire.
Ajustement parfait, comme son nom l'indique, est l'utilisation de classes de cas dans pattern matching avec
case
.hashCode
etequals
. Par exemple, vous voulez être en mesure de les utiliser comme des clés dans unSet
ouMap
Voici un autre, plus question de préférence personnelle:
Set
ouMap
, mais vous ne jamais avoir qu'une seule instance et ne nécessitent pas l'égalité structurelle, préférezclass Foo(val i: Int)
surcase class Foo(i: Int)
, parce que vous n'avez pas peut-être plus cher les contrôles d'égalité.Si 1. et 2. entrent en collision, vous pouvez mettre en œuvre des cas des fonctions de classe à la main. Par exemple, fournir un compagnon
apply
méthode ou un modèle d'appariement de l'extracteur pour une mutable non-classe de cas.Un cas de classe vous donne "libre" (c'est à dire, vous n'avez pas à écrire) implémentations de
equals
,hashcode
ettoString
, ainsi queapply
etunapply
dans le compagnon de l'objet.Fondamentalement, vous pouvez penser à un cas de classe comme un nommé tuple, dont les champs sont nommés ainsi.
Pour quoi que ce soit d'autre, vous êtes probablement mieux d'utiliser une classe normale.
cas, les classes sont datacentric.
Nous obtenir des avantages suivants en utilisant la classe de cas sur les classes régulières.
(1) Valeur d'équivalence : Cela signifie que dans deux cas, les instances peuvent être comparées avec les valeurs à l'intérieur d'eux.
Mais d'autres opérateurs de comparaison(>, >= <, etc) ne sont pas définis.
(2) Immuable Champs: Thread-safe
(3) Automatique de création de champ: heures et minutes sont immuables champs créés automatiquement par Scala.
cas, les classes sont également utilisés dans l'analyse de l'étincelle DataFrame lignes et l'avantage est que les colonnes de DataFrame peut être consulté par le champ nom de la classe de cas.
Normal classes sont des classes que les classes en Java. Il peut contenir à la fois l'état et la fonctionnalité.
Des classes de cas sont comme des données POJO Java. des classes qui contiennent de l'état, qui peut être utilisé par des fonctions (généralement dans d'autres classes).
Lorsque vous implémentez des données POJO Java, vous devez définir la variable il, ajouter les getter et setter pour eux, de mettre en œuvre hashcode et equals, et probablement mettre en œuvre toString.
Habituellement, il n'est pas si mal car après avoir défini les variables, les IDE peuvent générer tous pour vous, mais si vous changer/ajouter des variables, alors vous devriez vous rappeler de mettre à jour toutes les méthodes.
dans le cas de classes de définir les variables (ou mieux les valeurs) et le compilateur de générer toutes les méthodes pour vous. Si vous gagnez, pas de passe-partout et fonctionnalités mises à jour.
Pour les classes de cas le compilateur également générer plus de fonctionnalités, que vous n'avez pas et ne peut pas avoir en Java, la fonction de copie et de les appliquer/annuler dans la compaion objet.