Ich habe eine sehr einfache Frage: Wann sollten wir das neue Schlüsselwort beim Erstellen von Objekten in Scala anwenden? Versuchen wir nur Java-Objekte zu instanziieren?
quelle
Ich habe eine sehr einfache Frage: Wann sollten wir das neue Schlüsselwort beim Erstellen von Objekten in Scala anwenden? Versuchen wir nur Java-Objekte zu instanziieren?
Verwenden Sie das new
Schlüsselwort, wenn Sie auf einen class
eigenen Konstruktor verweisen möchten :
class Foo { }
val f = new Foo
Lassen new
Sie weg, wenn Sie sich auf die apply
Methode des Begleitobjekts beziehen :
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Wenn Sie eine Fallklasse erstellt haben:
case class Foo()
Scala erstellt heimlich ein Begleitobjekt für Sie und verwandelt es in Folgendes:
class Foo { }
object Foo {
def apply() = new Foo
}
So können Sie tun
f = Foo()
Beachten Sie zum Schluss, dass es keine Regel gibt, die besagt, dass die Companion- apply
Methode ein Proxy für den Konstruktor sein muss:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7
Und da Sie Java-Klassen erwähnt haben: Ja - Java-Klassen haben selten Begleitobjekte mit einer apply
Methode, daher müssen Sie new
den Konstruktor der eigentlichen Klasse verwenden.
Überhaupt nicht. Es gibt zwei allgemeine Fälle, in denen Sie
new
in Scala verzichten. Mit Singleton-Objekten (die häufig zum Speichern statischer Funktionen und als eine Art Factory verwendet werden, die der in Java gezeigten ähnelt):Bei einer Fallklasse (tatsächlich gibt es darunter Klasse + Objekt = Begleitmuster , z. B. Klasse und Objekt mit demselben Namen):
Wenn Sie also mit einfachen Klassen arbeiten, sind die Regeln dieselben wie bei Java.
Bonus, es gibt eine anonyme Klasse in Scala, die so aufgebaut werden kann:
quelle
Mit Scala 3 (das Mitte 2020, acht Jahre später, veröffentlicht werden soll), basierend auf Dotty : Nie.
Scala 3 wird "
new
" fallen lassen, wie in diesem Threadquelle