Solo estoy revisando algunos tutoriales de Scala en Internet y he notado en algunos ejemplos que se declara un objeto al comienzo del ejemplo.
¿Cuál es la diferencia entre class
y object
en Scala?
class C
define una clase, tal como en Java o C ++.object O
crea un objeto singletonO
como instancia de alguna clase anónima; se puede usar para mantener miembros estáticos que no están asociados con instancias de alguna clase.object O extends T
convierte el objeto en O
una instancia de trait T
; luego puede pasar a O
cualquier lugar, T
se espera a.class C
, entonces object C
es el objeto compañero de la clase C
; tenga en cuenta que el objeto complementario no es automáticamente una instancia de C
.Consulte también la documentación de Scala para el objeto y la clase .
object
como anfitrión de miembros estáticosEn la mayoría de los casos, necesita una object
para contener métodos y valores / variables que estarán disponibles sin tener que instanciar primero una instancia de alguna clase. Este uso está estrechamente relacionado con los static
miembros en Java.
object A {
def twice(i: Int): Int = 2*i
}
Luego puede llamar al método anterior usando A.twice(2)
.
Si twice
fuera miembro de alguna clase A
, primero necesitaría hacer una instancia:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Puede ver cuán redundante es esto, ya twice
que no requiere ningún dato específico de la instancia.
object
como una instancia especial con nombreTambién puede usar el object
propio como alguna instancia especial de una clase o rasgo. Cuando haces esto, tu objeto necesita extenderse un poco trait
para convertirse en una instancia de una subclase de él.
Considere el siguiente código:
object A extends B with C {
...
}
Esta declaración declara por primera vez una clase anónima (inaccesibles) que se extiende a ambos B
y C
, y crea la instancia de una única instancia de esta clase llamada A
.
Esto significa que A
puede pasarse a funciones que esperan objetos de tipo B
o C
, o B with C
.
object
También existen algunas características especiales de los objetos en Scala. Recomiendo leer la documentación oficial .
def apply(...)
habilita la sintaxis sin nombre del método habitual de A(...)
def unapply(...)
permite crear extractores de coincidencia de patrones personalizados
Commerce
clase, pero la JVM y el lenguaje Java sí. (Así es como puedes hacerobject Foo{ def main(args:Seq[String]) }
y esperar que el programa se ejecute.)A
class
es una definición, una descripción. Define un tipo en términos de métodos y composición de otros tipos.Un
object
es un singleton, una instancia de una clase que se garantiza que es única. Para cada parteobject
del código, se crea una clase anónima, que hereda de las clases que declaróobject
implementar. Esta clase no se puede ver desde el código fuente de Scala, aunque se puede obtener a través de la reflexión.Hay una relación entre
object
yclass
. Se dice que un objeto es el objeto compañero de una clase si comparten el mismo nombre. Cuando esto sucede, cada uno tiene acceso a métodos deprivate
visibilidad en el otro. Sin embargo, estos métodos no se importan automáticamente. Tiene que importarlos explícitamente o prefijarlos con el nombre de clase / objeto.Por ejemplo:
fuente
def f(x: X) = ???
, entonces podría llamar a métodos privadosx
, de la clase compañeraX
.Un objeto tiene exactamente una instancia (no se puede llamar
new MyObject
). Puede tener varias instancias de una clase.El objeto cumple los mismos propósitos (y algunos más) que los métodos y campos estáticos en Java.
fuente
Como muchos han explicado,
object
define una instancia singleton. Lo único en las respuestas aquí que creo que se omite es queobject
tiene varios propósitos.Puede ser el objeto complementario de un
class
/trait
, que contiene lo que podría considerarse métodos estáticos o métodos de conveniencia.Puede actuar como un módulo, que contiene tipos y definiciones relacionados / subsidiarios, etc.
Puede implementar una interfaz extendiendo
class
uno o mástrait
s.Puede representar un caso de un
sealed trait
que no contiene datos. A este respecto, a menudo se considera más correcto quecase class
a sin parámetros. El caso especial de unsealed trait
con solocase object
implementadores es más o menos la versión Scala de una enumeración.Puede actuar como evidencia de la
implicit
lógica impulsada.Introduce un tipo singleton.
Es una construcción muy poderosa y general. Lo que puede ser muy confuso para los principiantes de Scala es que la misma construcción puede tener usos muy diferentes. Y
object
puede servir muchos de estos diferentes usos a la vez, lo que puede ser aún más confuso.fuente
Definir un objeto en Scala es como definir una clase en Java que solo tiene métodos estáticos. Sin embargo, en Scala un objeto puede extender otra superclase, implementar interfaces y pasarlo como si fuera una instancia de una clase. (Entonces es como los métodos estáticos en una clase pero mejor).
fuente
La diferencia formal
La diferencia en el uso:
object
. Puede usarlo con o sin clase relacionada. En el primer caso se llama objeto complementario. Tienes que:Para crear un programa, debe usar el método principal en
object
, no enclass
.También puede usarlo al usar un objeto singleton en java.
fuente
La palabra clave object crea un nuevo tipo singleton, que es como una clase que solo tiene una única instancia con nombre. Si está familiarizado con Java, declarar un objeto en Scala es muy parecido a crear una nueva instancia de una clase anónima.
Scala no tiene equivalente a la palabra clave estática de Java , y un objeto a menudo se usa en Scala, donde puede usar una clase con miembros estáticos en Java.
fuente
Object es una clase pero ya tiene (es) una instancia, por lo que no puede llamar
new ObjectName
. Por otro lado, Class es solo tipo y puede ser una instancia llamandonew ClassName()
.fuente
En scala, no hay
static
concepto. Entonces scala crea un objeto singleton para proporcionar un punto de entrada para la ejecución de su programa. Si no crea un objeto singleton, su código se compilará correctamente pero no generará ningún resultado. Los métodos declarados dentro de Singleton Object son accesibles globalmente. Un objeto singleton puede extender clases y rasgos.Ejemplo de objeto Scala Singleton
Salida:
En scala, cuando tiene una clase con el mismo nombre que el objeto singleton, se llama clase acompañante y el objeto singleton se llama objeto acompañante.
La clase complementaria y su objeto complementario deben definirse en el mismo archivo fuente.
Ejemplo de objeto de Scala Companion
Salida:
En scala, una clase puede contener:
1. Miembro de datos
2. Método del miembro
3. Bloque constructor
4. Clase anidada
5. Información de super clase, etc.
Debe inicializar todas las variables de instancia en la clase. No hay alcance predeterminado. Si no especifica el alcance de acceso, es público. Debe haber un objeto en el que se defina el método principal. Proporciona un punto de partida para su programa. Aquí, hemos creado un ejemplo de clase.
Ejemplo de clase Scala de clase
Lo siento, es demasiado tarde, pero espero que te ayude.
fuente
La clase Scala es igual a la clase Java, pero scala no le ofrece ningún método de entrada en clase, como el método principal en Java. El método principal asociado con la palabra clave objeto. Puede pensar en la palabra clave object como la creación de un objeto singleton de una clase que se define implícitamente.
Para obtener más información, consulte esta clase de artículo y la palabra clave de objeto en la programación de Scala
fuente
El objeto es similar a la clase estática en Java hasta cierto punto, la característica estática significa que la clase estática no necesita crear un objeto cuando se coloca en la JVM, puede usarse directamente por su nombre de clase y la misma instancia (mismo estado de datos ) se comparte donde sea que se use.
fuente
Una clase es como cualquier otra clase en otros idiomas. Define la clase como cualquier otro idioma con alguna diferencia de sintaxis.
Sin embargo, object es una clase con un solo objeto solamente. Esto lo hace interesante ya que se puede usar para crear miembros estáticos de una clase usando un objeto complementario . Este objeto complementario tiene acceso a miembros privados de la definición de clase y tiene el mismo nombre que la clase que está definiendo.
Además, un punto notable es que la clase de objeto se crea perezosamente, que es otro punto importante. Por lo tanto, estos no se instancian a menos que sean necesarios en nuestro código.
Si está definiendo la creación de conexión para JDBC, puede crearlos dentro del objeto para evitar la duplicación al igual que lo hacemos en Java con objetos singleton.
fuente
Si viene de Java, el concepto de clase en scala es similar a Java, pero la clase en scala no puede contener miembros estáticos.
Los objetos en scala son de tipo singleton al que llamas métodos dentro de él usando el nombre del objeto, en scala el objeto es una palabra clave y en java el objeto es una instancia de clase
fuente