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?palabra clave "nueva" en Scala
Respuesta
utilizar la palabra clave new
cuando se quiere hacer referencia a una propia constructora class
's:
class Foo { }
val f = new Foo
Omitir new
si se está refiriendo a apply
el método del objeto compañera:
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Si He hecho una clase de caso:
case class Foo()
Scala en secreto crea un objeto compañero para usted, convirtiéndolo en esto:
class Foo { }
object Foo {
def apply() = new Foo
}
para que pueda hacer
f = Foo()
Por último, tenga en cuenta que no hay ninguna regla que dice que el compañero apply
método tiene que ser un proxy para el constructor:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
[email protected]
> println(Foo())
7
Y, ya que ha mencionado clases Java: Sí - clases Java raramente por pla e objetos complementarios con un método apply
, por lo que debe usar new
y el constructor de la clase real .
¿Es cuando intentamos instanciar solo objetos java?
No, en absoluto. Hay dos casos generales cuando omite new
en scala. con objetos simples (que se utilizan oftenly para almacenar funciones estáticas y como una especie de fábrica similar a lo que puede verse en 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 (en realidad, debajo hay son de clase + objeto = companion patrón, por ejemplo, con clase y objeto con el mismo nombre):
scala> case class Foo(bar: String)
defined class Foo
scala> Foo("baz")
res2: Foo = Foo(baz)
Así que cuando se trabaja con unas simples clases, las reglas son las mismas que 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")
Bono, hay una clases anónimas en Scala, que pueden ser construidas de esta manera:
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: objetos complementarios y palabra clave "nueva"
- 2. C++: estructura y la nueva palabra clave
- 3. Hibernate nueva palabra clave con distinta
- 4. Scala: palabra clave como nombre del paquete
- 5. palabra clave 'nueva' en getter> impacto en el rendimiento?
- 6. palabra clave "nueva" en declaración de propiedad en C#
- 7. ¿La nueva palabra clave 'dinámica' C# 4.0 desaprueba la palabra clave 'var'?
- 8. nueva palabra clave sin nombre de la clase en C#
- 9. ¿Qué pasa con la palabra clave "nueva" en C++?
- 10. ¿Para qué sirve la palabra clave forSome en Scala?
- 11. llamando al método base usando la nueva palabra clave
- 12. Java: Interfaz con nueva palabra clave ¿cómo es posible?
- 13. Violación de acceso ubicación de lectura 0x00000000. ¿palabra clave "nueva"?
- 14. Crear una nueva palabra clave Perl con Devel :: Declare
- 15. palabra clave "exists" en Python?
- 16. ¿Cómo se puede agregar una nueva palabra clave a clang, una palabra clave que se trataría como principal?
- 17. palabra clave privada vs no palabra clave privada
- 18. palabra clave estática en C#
- 19. Registro palabra clave en C++
- 20. palabra clave "agradable" en C++?
- 21. palabra clave foreach en java?
- 22. palabra clave 'fuera' en C++
- 23. palabra clave predeterminada en php
- 24. Palabra clave abstracta en PHP
- 25. Palabra clave "Sobrecarga" en VB.NET
- 26. esta palabra clave en android
- 27. USO palabra clave en Mysql
- 28. Súper palabra clave en Ruby
- 29. Palabra clave protegida C#
- 30. anidada sincronizada palabra clave
clase de Java nunca puede tener un objeto acompañante. Puede tener un objeto que pueda funcionar como una Factory para la clase Java, pero este objeto no es su objeto complementario. – sschaef
@Antoras Dado que las clases de Scala se compilan en bytecode de Java y se pueden distribuir de forma compilada, ¿Scala puede diferenciar entre un compañero real de Scala y una clase llamada Foo $ con un miembro de MODULE $ estático? – Owen
Creo que Scalac puede diferir porque se especifica que un objeto complementario debe declararse en el mismo archivo que su clase complementaria.Debido a que la "propiedad" acompañante sólo existe en Scala y no en scalac a nivel de código de bytes tiene que comprobar el código Scala y no el código de bytes para asegurarse de que se sigue la especificación. – sschaef