«Nouveau» mot clé dans Scala

J’ai une question très simple: quand devrions-nous appliquer le nouveau motclé lors de la création d’objects dans Scala? Est-ce quand nous essayons d’instancier uniquement des objects Java?

Utilisez le new mot-clé lorsque vous souhaitez vous référer au constructeur d’une class :

 class Foo { } val f = new Foo 

Omettez les new si vous faites référence à la méthode d’ apply l’object compagnon:

 class Foo { } object Foo { def apply() = new Foo } // Both of these are legal val f = Foo() val f2 = new Foo 

Si vous avez créé une classe de cas:

 case class Foo() 

Scala crée secrètement un object compagnon pour vous, en le transformant en ceci:

 class Foo { } object Foo { def apply() = new Foo } 

Donc tu peux faire

 f = Foo() 

Enfin, gardez à l’esprit qu’aucune règle ne dit que la méthode d’ apply compagnon doit être un proxy pour le constructeur:

 class Foo { } object Foo { def apply() = 7 } // These do different things > println(new Foo) test@5c79cc94 > println(Foo()) 7 

Et, puisque vous avez mentionné les classes Java: yes – les classes Java ont rarement des objects compagnon avec une méthode apply , vous devez donc utiliser le constructeur new et la classe réelle.

Est-ce quand on essaye d’instancier des objects Java seulement?

Pas du tout. Il y a deux cas généraux lorsque vous vous rendez à la Scala. Avec des objects singleton (qui sont souvent utilisés pour stocker des fonctions statiques et comme une sorte de fabrique similaire à ce que vous pouvez voir dans java):

 scala> object LonelyGuy { def mood = "sad" } defined module LonelyGuy scala> LonelyGuy res0: LonelyGuy.type = LonelyGuy$@3449a8 scala> LonelyGuy.mood res4: java.lang.Ssortingng = sad 

Avec une classe de cas (en fait, en dessous, il y a class + object = pattern compagnon , par exemple avoir une classe et un object avec le même nom):

 scala> case class Foo(bar: Ssortingng) defined class Foo scala> Foo("baz") res2: Foo = Foo(baz) 

Donc, lorsque vous travaillez avec une classe simple, les règles sont les mêmes qu’avec Java.

 scala> class Foo(val bar: Ssortingng) defined class Foo scala> new Foo("baz") res0: Foo = Foo@2ad6a0 // will be a error scala> Foo("baz") :8: error: not found: value Foo Foo("baz") 

En prime, il y a des cours anonymes en scala, qui peuvent être construits comme ceci:

 scala> new { val bar = "baz" } res2: java.lang.Object{val bar: java.lang.Ssortingng} = $anon$1@10ee5b8 scala> res2.bar res3: java.lang.Ssortingng = baz