2010-09-22 26 views
2

J'ai une classe de cas (nommez-le Stuff) que je veux être en mesure de créer des sous-classes anonymes de lors de l'exécution en étendant un trait (appelez-le Marker). Voici un extrait d'une session de REPL qui illustre ce que je suis en train de faire:L'utilisation du constructeur est-elle autorisée avec les classes de cas?

scala> trait Marker 
defined trait Marker 

scala> case class Stuff(i: Int) 
defined class Stuff 

scala> val a = Stuff(1) 
a: Stuff = Stuff(1) 

scala> val b = new Stuff(1) with Marker 
b: Stuff with Marker = Stuff(1) 

Notez comment a instancié à l'aide Stuff.apply(), alors que dans b « s cas j'appelle la classe affaire » constructeur.

Ma question est: est l'instanciation des classes de cas en utilisant un constructeur kasher? Il me semble que c'est, puisque les commodités habituelles fournies par les classes de cas, tels que ==, .equals(), et .hashCode(), tout le travail. Ai-je manqué quelque chose qui pourrait marquer ce que je fais un Bad Thing (TM)?

scala> a == b 
res0: Boolean = true 

scala> a.equals(b) 
res1: Boolean = true 

scala> a.hashCode == b.hashCode 
res2: Boolean = true 

Répondre

3

Voici comment Stuff.apply est mis en œuvre:

object Stuff { 
    def apply(i: Int): Stuff = new Stuff(i) 
} 

Il n'y a donc aucun mal à utiliser new Stuff.

3

A la question

est instancié cours de cas en utilisant un constructeur casher

la réponse est certainement oui. Quelque chose comme

val b = new Stuff(1) 

ne pose aucun problème. Maintenant, new Stuff(1) with Marker est différent car une sous-classe anonyme de Stuff est créée. Je crois, cependant, que ce n'est toujours pas problématique. Les problèmes que je connais apparaissent lorsque les classes de cas héritent d'autres classes de cas, et vous ne le faites pas. Mais je peux être inconscient de quelque chose.

EDIT: qu'aligner testé dans le REPL:

scala> val b = new Stuff(1) 
b: Stuff = Stuff(1) 

scala> b match {case Stuff(x) => x} 
res0: Int = 1 

scala> b match {case Stuff(_) => true} 
res1: Boolean = true 
+2

Le seul problème mineur potentiel que je vois là est avec la correspondance de modèle. 'b' ci-dessus ne correspondra pas à Stuff (_), mais' val c: Stuff = new Stuff (1) avec Marker' correspondra très bien. –

+0

Il ne correspond pas, voir la mise à jour. –

+1

Je pense que @Max voulait dire ceci: http://paste.pocoo.org/show/266270/ – missingfaktor