2010-11-21 25 views
12

Je suis en train de mettre en œuvre un Plurk API en faveur de Scala, mais j'ai un choix de conception à faire. Par exemple, l'attribut de genre d'un utilisateur de Plurk pourrait être l'un de "mâle", "femelle", "autre".Dois-je préférer la classe scellée ou l'énumération dans Scala?

sealed trait Gender 
object Male extends Gender 
object Female extends Gender 
object Others extends Gender 

La question est de savoir si je préfère une classe/un objet scellé comme l'exemple de code ci-dessus, sur Enumeration pour représenter des types d'énumération? Parce que je trouve que je trouve rarement énumération lorsque j'utilise une autre librairie Scala, et beaucoup de tutoriel d'Actor utilisent des classes/objets scellés pour représenter des messages pour Actor. Cela signifie-t-il que dans Scala, la classe scellée est un choix meilleur/conventionnel que l'énumération?

+0

duplication possible de [Classes de cas vs énumérations dans Scala] (http://stackoverflow.com/questions/1898932/case-classes-vs-enumerations-in-scala) –

Répondre

11

Si vous n'avez pas besoin d'itérer sur vos objets de genre ou besoin de méthodes comme next et previous, les classes et les objets sont la bonne solution.

Si vous avez besoin des fonctionnalités de la "classes et objets" et de "scala.Enumeration" this et this question qui pourrait vous intéresser.

+0

Si vous avez besoin d'itérer sur les traits scellés, vous pouvez aussi utiliser [this] (http://stackoverflow.com/questions/13671734/iteration-over-a-sealed-trait-in-scala) solution basée sur une macro – Oswaldo

9

En utilisant Enumeration est également un peu moins cher en termes de nombre de classes. Dans l'exemple Gender cela n'a pas d'importance, mais cela pourrait être important si vous voulez modéliser les instructions du processeur par une énumération avec plus de 100 éléments.

+2

'Enumeration' serait encore plus agréable si le compilateur mettait en garde sur les cas manquants comme pour les traits scellés. –