108 votes

"nouveau" mot clé en Scala

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

155voto

Owen Points 14439

Utiliser l' new mot-clé si vous voulez faire référence à un class's propre constructeur:

class Foo { }

val f = new Foo

Omettre new si vous faites référence à la compagne de l'objet apply méthode:

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

// Both of these are legal
val f = Foo()
val f2 = new Foo

Si vous avez fait une classe de cas:

case class Foo()

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

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

De sorte que vous pouvez faire

f = Foo()

Enfin, gardez à l'esprit qu'il n'y a aucune règle qui dit que le compagnon apply la méthode 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é des classes Java: oui-classes Java rarement compagnon d'objets avec un apply méthode, vous devez utiliser new et le réel constructeur de la classe.

16voto

om-nom-nom Points 33691

Est-il lorsque nous essayons d'instancier des objets java uniquement?

Pas du tout. Il y a deux cas généraux lorsque vous omettre new en scala. Avec les objets singleton (qui sont souvent utilisés pour stocker des fonctions statiques et comme une sorte de tissus que vous avez peut-vu en java):

scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy

scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8

scala> LonelyGuy.mood
res4: java.lang.String = sad

Avec une des classes de cas (en fait, en dessous il y a la classe + objet = compagnon motif, par exemple, avoir de la classe et de l'objet avec le même nom):

scala> case class Foo(bar: String) 
defined class Foo


scala> Foo("baz")
res2: Foo = Foo(baz)

Ainsi, lorsque vous travaillez avec un simple, les classes, les règles sont les mêmes qu'avec Java.

scala> class Foo(val bar: String) 
defined class Foo

scala> new Foo("baz")
res0: Foo = Foo@2ad6a0

// will be a error 
scala> Foo("baz")
<console>:8: error: not found: value Foo
       Foo("baz")

Bonus, il y a un anonyme classes scala, qui peut être construit comme ceci:

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

scala> res2.bar
res3: java.lang.String = baz

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X