Ho una domanda molto semplice - quando dovremmo applicare la nuova parola chiave durante la creazione di oggetti in Scala? È quando proviamo a istanziare solo gli oggetti Java?Parola chiave "nuova" in Scala
risposta
Utilizzare la parola new
quando si vuole fare riferimento a un proprio costruttore di 's class
:
class Foo { }
val f = new Foo
Omettere new
se si fa riferimento al apply
metodo dell'oggetto compagna:
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Se Ho realizzato una classe di casi:
case class Foo()
Scala crea in segreto un oggetto associato per voi, trasformandolo in questo:
class Foo { }
object Foo {
def apply() = new Foo
}
modo da poter fare
f = Foo()
Infine, tenere a mente che non c'è una regola che dice che il compagno apply
il metodo deve essere un proxy per il costruttore:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
[email protected]
> println(Foo())
7
E, dal momento che lei ha citato le classi Java: si - classi Java raramente hav e oggetti associati con un metodo apply
, quindi è necessario utilizzare new
e il costruttore della classe effettiva.
È quando proviamo a istanziare solo oggetti java?
Niente affatto. Vi sono due casi generali quando si ommit new
in scala. Con oggetti Singleton (che vengono oftenly utilizzati per memorizzare funzioni statiche e come una sorta di fabbrica di simile a quello che si può vedere in java):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = [email protected]
scala> LonelyGuy.mood
res4: java.lang.String = sad
Con un case classes (in realtà, al di sotto ci sono class + oggetto = companion modello, ad esempio avere classe e oggetto con lo stesso nome):
scala> case class Foo(bar: String)
defined class Foo
scala> Foo("baz")
res2: Foo = Foo(baz)
Quindi, quando si lavora con un semplice classi, le regole sono le stesse con Java.
scala> class Foo(val bar: String)
defined class Foo
scala> new Foo("baz")
res0: Foo = [email protected]
// will be a error
scala> Foo("baz")
<console>:8: error: not found: value Foo
Foo("baz")
bonus, v'è un classi anonime in scala, che possono essere costruiti in questo modo:
scala> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = [email protected]
scala> res2.bar
res3: java.lang.String = baz
- 1. Scala: oggetti companion e parola chiave "nuova"
- 2. Ruolo della nuova parola chiave in Java
- 3. Usa nuova parola chiave in C#
- 4. parola chiave di blocco in Scala
- 5. Cosa fa la nuova parola chiave qui?
- 6. Fai la nuova parola chiave opzionale
- 7. Lucee - Nuova parola chiave Coldfusion non funziona
- 8. Scala: parola chiave come nome pacchetto
- 9. incapace di comprendere nuova parola chiave in java
- 10. Cosa c'è di sbagliato nella "nuova" parola chiave in C++?
- 11. nuova parola chiave, senza nome di classe in C#
- 12. Qual è la parola chiave forSome in Scala per?
- 13. Cos'è questo Scala 'nuova' sintassi
- 14. "esiste" parola chiave in Python?
- 15. JavaScript nuova parola chiave e gestione della memoria
- 16. Perché non è necessaria una nuova parola chiave per String
- 17. chiamando il metodo di base utilizzando la nuova parola chiave
- 18. Java: interfaccia con una nuova parola chiave come è possibile?
- 19. Nuova parola chiave: perché il metodo derivato non viene chiamato?
- 20. Perché kotlin ha abbandonato la parola chiave "nuova"?
- 21. parola chiave memorizzati in Delphi
- 22. Registrati parola chiave in C++
- 23. Parola chiave "nice" in C++?
- 24. Parola chiave astratta in PHP
- 25. UTILIZZO parola chiave in MySQL
- 26. "come" parola chiave in OCaml
- 27. parola chiave virtuale in C#
- 28. parola chiave predefinita in php
- 29. "con" parola chiave in javascript
- 30. Parola chiave statica in C#
classe A Java non può mai avere un oggetto associato. Può avere un oggetto che può funzionare come Factory per la classe Java, ma questo oggetto non è il suo oggetto complementare. – sschaef
@Antoras Poiché le classi di Scala compilano in codice bytecode Java e possono essere distribuite in forma compilata, Scala può dire la differenza tra un compagno Scala effettivo e una classe chiamata Foo $ con un membro MODULE $ statico? – Owen
Penso che Scalac possa differire da questo perché si specifica che un oggetto associato debba essere dichiarato nello stesso file della sua classe companion.Poiché la "proprietà" companion esiste solo in Scala e non in livello di codice Bytecode, scalac deve controllare il codice Scala e non il Bytecode per assicurarsi che la specifica sia seguita. – sschaef