Tengo una pregunta muy simple: ¿cuándo deberíamos aplicar la nueva palabra clave al crear objetos en Scala? ¿Es cuando intentamos crear instancias de objetos Java solamente?
fuente
Tengo una pregunta muy simple: ¿cuándo deberíamos aplicar la nueva palabra clave al crear objetos en Scala? ¿Es cuando intentamos crear instancias de objetos Java solamente?
Utilice la new
palabra clave cuando desee hacer referencia al class
propio constructor de a:
class Foo { }
val f = new Foo
Omita new
si se refiere al apply
método del objeto complementario :
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Si ha creado una clase de caso:
case class Foo()
Scala crea en secreto un objeto complementario para usted, convirtiéndolo en esto:
class Foo { }
object Foo {
def apply() = new Foo
}
Para que puedas hacer
f = Foo()
Por último, tenga en cuenta que no hay ninguna regla que diga que el apply
método complementario debe ser un proxy del constructor:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7
Y, como mencionaste las clases de Java: sí, las clases de Java rara vez tienen objetos complementarios con un apply
método, por lo que debes usar new
y el constructor de la clase real.
De ningún modo. Hay dos casos generales en los que omite
new
en scala. Con objetos singleton (que a menudo se usan para almacenar funciones estáticas y como una especie de fábrica similar a lo que puede ver en Java):Con clases de caso (en realidad, debajo hay clase + objeto = patrón complementario , por ejemplo, tener clase y objeto con el mismo nombre):
Entonces, cuando trabaja con clases simples, las reglas son las mismas que con Java.
Además, hay clases anónimas en scala, que se pueden construir así:
fuente
Con Scala 3 (que debería lanzarse a mediados de 2020, ocho años después), basado en Dotty : nunca.
Scala 3 soltará "
new
", como en este hilofuente